/*
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 * 02111-1307, USA.
 *
 * http://www.gnu.org/copyleft/gpl.html
 */

package l1j.server.server.clientpackets;

import static l1j.server.server.model.skill.L1SkillId.*;

import java.lang.reflect.Constructor;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Random;
import java.util.TimeZone;
import java.util.logging.Level;
import java.util.logging.Logger;

import l1j.server.configure.Config;
import l1j.server.server.ActionCodes;
import l1j.server.server.ClientThread;
import l1j.server.server.FishingTimeController;
import l1j.server.server.IdFactory;
import l1j.server.server.datatables.CharacterTable;
import l1j.server.server.datatables.FurnitureSpawnTable;
import l1j.server.server.datatables.ItemTable;
import l1j.server.server.datatables.LetterTable;
import l1j.server.server.datatables.LogEnchantTable;
import l1j.server.server.datatables.MagicDollTable;
import l1j.server.server.datatables.NpcTable;
import l1j.server.server.datatables.PetTable;
import l1j.server.server.datatables.PolyTable;
import l1j.server.server.datatables.ResolventTable;
import l1j.server.server.datatables.SkillTable;
import l1j.server.server.model.Getback;
import l1j.server.server.model.L1CastleLocation;
import l1j.server.server.model.L1Character;
import l1j.server.server.model.L1Clan;
import l1j.server.server.model.L1Cooking;
import l1j.server.server.model.L1EffectSpawn;
import l1j.server.server.model.L1HouseLocation;
import l1j.server.server.model.L1ItemDelay;
import l1j.server.server.model.L1Location;
import l1j.server.server.model.L1Object;
import l1j.server.server.model.L1PolyMorph;
import l1j.server.server.model.L1Quest;
import l1j.server.server.model.L1SpellBook;
import l1j.server.server.model.L1Teleport;
import l1j.server.server.model.L1TownLocation;
import l1j.server.server.model.L1World;
import l1j.server.server.model.Instance.L1DollInstance;
import l1j.server.server.model.Instance.L1EffectInstance;
import l1j.server.server.model.Instance.L1FurnitureInstance;
import l1j.server.server.model.Instance.L1GuardianInstance;
import l1j.server.server.model.Instance.L1ItemInstance;
import l1j.server.server.model.Instance.L1MonsterInstance;
import l1j.server.server.model.Instance.L1NpcInstance;
import l1j.server.server.model.Instance.L1PcInstance;
import l1j.server.server.model.Instance.L1PetInstance;
import l1j.server.server.model.Instance.L1TowerInstance;
import l1j.server.server.model.inventory.L1Inventory;
import l1j.server.server.model.inventory.L1PcInventory;
import l1j.server.server.model.item.L1ItemId;
import l1j.server.server.model.item.L1TreasureBox;
import l1j.server.server.model.poison.L1DamagePoison;
import l1j.server.server.model.skill.L1SkillUse;
import l1j.server.server.random.RandomGenerator;
import l1j.server.server.random.RandomGeneratorFactory;
import l1j.server.server.serverpackets.S_AttackPacket;
import l1j.server.server.serverpackets.S_CurseBlind;
import l1j.server.server.serverpackets.S_Fishing;
import l1j.server.server.serverpackets.S_IdentifyDesc;
import l1j.server.server.serverpackets.S_ItemName;
import l1j.server.server.serverpackets.S_Letter;
import l1j.server.server.serverpackets.S_Liquor;
import l1j.server.server.serverpackets.S_Message_YN;
import l1j.server.server.serverpackets.S_NPCTalkReturn;
import l1j.server.server.serverpackets.S_OwnCharAttrDef;
import l1j.server.server.serverpackets.S_OwnCharStatus;
import l1j.server.server.serverpackets.S_OwnCharStatus2;
import l1j.server.server.serverpackets.S_PacketBox;
import l1j.server.server.serverpackets.S_Paralysis;
import l1j.server.server.serverpackets.S_SPMR;
import l1j.server.server.serverpackets.S_ServerMessage;
import l1j.server.server.serverpackets.S_ShowPolyList;
import l1j.server.server.serverpackets.S_SkillBrave;
import l1j.server.server.serverpackets.S_SkillHaste;
import l1j.server.server.serverpackets.S_SkillIconAura;
import l1j.server.server.serverpackets.S_SkillIconBlessOfEva;
import l1j.server.server.serverpackets.S_SkillIconGFX;
import l1j.server.server.serverpackets.S_SkillIconWisdomPotion;
import l1j.server.server.serverpackets.S_SkillSound;
import l1j.server.server.serverpackets.S_Sound;
import l1j.server.server.serverpackets.S_SystemMessage;
import l1j.server.server.serverpackets.S_UseAttackSkill;
import l1j.server.server.templates.L1Account;
import l1j.server.server.templates.L1Armor;
import l1j.server.server.templates.L1BookMark;
import l1j.server.server.templates.L1EtcItem;
import l1j.server.server.templates.L1InventoryItem;
import l1j.server.server.templates.L1Item;
import l1j.server.server.templates.L1MagicDoll;
import l1j.server.server.templates.L1Npc;
import l1j.server.server.templates.L1Pet;
import l1j.server.server.templates.L1Skill;
import l1j.server.server.utils.L1ItemUtil;
import l1j.server.server.utils.L1SpawnUtil;

// Referenced classes of package l1j.server.server.clientpackets:
// ClientBasePacket
//
public class C_ItemUSe extends ClientBasePacket {

	private static final String C_ITEM_USE = "[C] C_ItemUSe";
	private static Logger _log = Logger.getLogger(C_ItemUSe.class.getName());

	private static RandomGenerator _random = RandomGeneratorFactory.newRandom();
	private static Random _randomForGaussian = new Random();

	public C_ItemUSe(byte abyte0[], ClientThread client) throws Exception {
		super(abyte0);
		int itemObjid = readD();

		L1PcInstance pc = client.getActiveChar();
		if (pc.isGhost()) {
			return;
		}
		L1ItemInstance l1iteminstance = pc.getInventory().getItem(itemObjid);

		if (l1iteminstance.getItem().getUseType() == -1) { // none:使用できないアイテム
			pc
					.sendPackets(new S_ServerMessage(74, l1iteminstance
							.getLogName())); // \f1%0は使用できません。
			return;
		}
		int pcObjid = pc.getId();
		if (pc.isTeleport()) { // テレポート処理中
			return;
		}
		if (l1iteminstance == null && pc.isDead() == true) {
			return;
		}
		if (!pc.getMap().isUsableItem()) {
			pc.sendPackets(new S_ServerMessage(563)); // \f1ここでは使えません。
			return;
		}
		int itemId;
		try {
			itemId = l1iteminstance.getItem().getItemId();
		} catch (Exception e) {
			return;
		}
		int l = 0;

		String s = "";
		@SuppressWarnings("unused")
		int bmapid = 0;
		int btele = 0;
		int blanksc_skillid = 0;
		int spellsc_objid = 0;
		int spellsc_x = 0;
		int spellsc_y = 0;
		int resid = 0;
		int letterCode = 0;
		String letterReceiver = "";
		byte[] letterText = null;
		int cookStatus = 0;
		int cookNo = 0;
		int fishX = 0;
		int fishY = 0;

		int use_type = l1iteminstance.getItem().getUseType();
		if (itemId == 40088 || itemId == 40096 || itemId == 140088) {
			s = readS();
		} else if (itemId == L1ItemId.SCROLL_OF_ENCHANT_ARMOR
				|| itemId == L1ItemId.SCROLL_OF_ENCHANT_WEAPON
				|| itemId == L1ItemId.SCROLL_OF_ENCHANT_QUEST_WEAPON
				|| itemId == 40077
				|| itemId == 40078
				|| itemId == 40126
				|| itemId == 40098
				|| itemId == 40129
				|| itemId == 40130
				|| itemId == 140129
				|| itemId == 140130
				|| itemId == L1ItemId.B_SCROLL_OF_ENCHANT_ARMOR
				|| itemId == L1ItemId.B_SCROLL_OF_ENCHANT_WEAPON
				|| itemId == L1ItemId.C_SCROLL_OF_ENCHANT_ARMOR
				|| itemId == L1ItemId.C_SCROLL_OF_ENCHANT_WEAPON
				|| itemId == 41029 // 召喚球の欠片
				|| itemId == 40317
				|| itemId == 41036
				|| itemId == 41245
				|| itemId == 40127
				|| itemId == 40128
				|| itemId == 41048
				|| itemId == 41049
				|| itemId == 41050 // 糊付けされた航海日誌ページ
				|| itemId == 41051
				|| itemId == 41052
				|| itemId == 41053 // 糊付けされた航海日誌ページ
				|| itemId == 41054
				|| itemId == 41055
				|| itemId == 41056 // 糊付けされた航海日誌ページ
				|| itemId == 41057 // 糊付けされた航海日誌ページ
				|| itemId == 40925
				|| itemId == 40926
				|| itemId == 40927 // 浄化・ミステリアスポーション
				|| itemId == 40928
				|| itemId == 40929
				|| itemId == 40931
				|| itemId == 40932
				|| itemId == 40933 // 加工されたサファイア
				|| itemId == 40934
				|| itemId == 40935
				|| itemId == 40936
				|| itemId == 40937 // 加工されたエメラルド
				|| itemId == 40938
				|| itemId == 40939
				|| itemId == 40940
				|| itemId == 40941 // 加工されたルビー
				|| itemId == 40942
				|| itemId == 40943
				|| itemId == 40944
				|| itemId == 40945 // 加工された地ダイア
				|| itemId == 40946
				|| itemId == 40947
				|| itemId == 40948
				|| itemId == 40949 // 加工された水ダイア
				|| itemId == 40950 || itemId == 40951
				|| itemId == 40952
				|| itemId == 40953 // 加工された風ダイア
				|| itemId == 40954 || itemId == 40955 || itemId == 40956
				|| itemId == 40957 // 加工された火ダイア
				|| itemId == 40958 || itemId == 40964 // ダークマジックパウダー
				|| itemId == 49092 // 歪みのコア
				|| itemId == 41426 // 封印スクロール
				|| itemId == 41427 // 封印解除スクロール
				|| itemId == 40075 // 防具破壊スクロール
				|| itemId == 41429 // 風の武器強化スクロール
				|| itemId == 41430 // 地の武器強化スクロール
				|| itemId == 41431 // 水の武器強化スクロール
				|| itemId == 41432) { // 火の武器強化スクロール
			l = readD();
		} else if (itemId == 140100 || itemId == 40100 || itemId == 40099
				|| itemId == 40086 || itemId == 40863) {
			bmapid = readH();
			btele = readD();
			pc.sendPackets(new S_Paralysis(S_Paralysis.TYPE_TELEPORT_UNLOCK,
					false));
		} else if (itemId == 40090 || itemId == 40091 || itemId == 40092
				|| itemId == 40093 || itemId == 40094) { // ブランクスクロール(Lv1)～(Lv5)
			blanksc_skillid = readC();
		} else if (use_type == 30 || itemId == 40870 || itemId == 40879) { // spell_buff
			spellsc_objid = readD();
		} else if (use_type == 5 || use_type == 17) { // spell_long、spell_short
			spellsc_objid = readD();
			spellsc_x = readH();
			spellsc_y = readH();
		} else if (itemId == 40089 || itemId == 140089) { // 復活スクロール、祝福された復活スクロール
			resid = readD();
		} else if (itemId == 40310 || itemId == 40311 || itemId == 40730
				|| itemId == 40731 || itemId == 40732) { // 便箋
			letterCode = readH();
			letterReceiver = readS();
			letterText = readByte();
		} else if (itemId >= 41255 && itemId <= 41259) { // 料理の本
			cookStatus = readC();
			cookNo = readC();
		} else if (itemId == 41293 || itemId == 41294) { // 釣り竿
			fishX = readH();
			fishY = readH();
		} else {
			l = readC();
		}

		if (pc.getCurrentHp() > 0) {
			int delay_id = 0;
			if (l1iteminstance.getItem().getType2() == 0) { // 種別：その他のアイテム
				delay_id = ((L1EtcItem) l1iteminstance.getItem()).get_delayid();
			}
			if (delay_id != 0) { // ディレイ設定あり
				if (pc.hasItemDelay(delay_id) == true) {
					return;
				}
			}

			// 再使用チェック
			boolean isDelayEffect = false;
			if (l1iteminstance.getItem().getType2() == 0) {
				int delayEffect = ((L1EtcItem) l1iteminstance.getItem())
						.get_delayEffect();
				if (delayEffect > 0) {
					isDelayEffect = true;
					Timestamp lastUsed = l1iteminstance.getLastUsed();
					if (lastUsed != null) {
						Calendar cal = Calendar.getInstance();
						if ((cal.getTimeInMillis() - lastUsed.getTime()) / 1000 <= delayEffect) {
							// \f1何も起きませんでした。
							pc.sendPackets(new S_ServerMessage(79));
							return;
						}
					}
				}
			}

			L1ItemInstance l1iteminstance1 = pc.getInventory().getItem(l);
			_log.finest("request item use (obj) = " + itemObjid + " action = "
					+ l + " value = " + s);
			if (itemId == 40077 || itemId == L1ItemId.SCROLL_OF_ENCHANT_WEAPON
					|| itemId == L1ItemId.SCROLL_OF_ENCHANT_QUEST_WEAPON
					|| itemId == 40130 || itemId == 140130
					|| itemId == L1ItemId.B_SCROLL_OF_ENCHANT_WEAPON
					|| itemId == L1ItemId.C_SCROLL_OF_ENCHANT_WEAPON
					|| itemId == 40128) { // 武器強化スクロール
				if (l1iteminstance1 == null
						|| l1iteminstance1.getItem().getType2() != 1) {
					pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
					return;
				}

				int safe_enchant = l1iteminstance1.getItem().get_safeenchant();
				if (safe_enchant < 0) { // 強化不可
					pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
					return;
				}

				if (l1iteminstance1.isSealed()) { // 封印された装備強化不可
					pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
					return;
				}

				int quest_weapon = l1iteminstance1.getItem().getItemId();
				if (quest_weapon >= 246 && quest_weapon <= 249) { // 強化不可
					if (itemId == L1ItemId.SCROLL_OF_ENCHANT_QUEST_WEAPON) { // 試練のスクロール
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
						return;
					}
				}
				if (itemId == L1ItemId.SCROLL_OF_ENCHANT_QUEST_WEAPON) { // 試練のスクロール
					if (quest_weapon >= 246 && quest_weapon <= 249) { // 強化不可
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
						return;
					}
				}
				int weaponId = l1iteminstance1.getItem().getItemId();
				if (weaponId == 36 || weaponId == 183 || weaponId >= 250
						&& weaponId <= 255) { // イリュージョン武器
					if (itemId == 40128) { // イリュージョン武器強化スクロール
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
						return;
					}
				}
				if (itemId == 40128) { // イリュージョン武器強化スクロール
					if (weaponId == 36 || weaponId == 183 || weaponId >= 250
							&& weaponId <= 255) { // イリュージョン武器
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
						return;
					}
				}

				int enchant_level = l1iteminstance1.getEnchantLevel();

				if (itemId == L1ItemId.C_SCROLL_OF_ENCHANT_WEAPON) { // c-dai
					pc.getInventory().removeItem(l1iteminstance, 1);
					if (enchant_level < -6) {
						// -7以上はできない。
						FailureEnchant(pc, l1iteminstance1, client);
					} else {
						SuccessEnchant(pc, l1iteminstance1, client, -1);
					}
				} else if (enchant_level < safe_enchant) {
					pc.getInventory().removeItem(l1iteminstance, 1);
					SuccessEnchant(pc, l1iteminstance1, client, RandomELevel(
							l1iteminstance1, itemId));
				} else {
					pc.getInventory().removeItem(l1iteminstance, 1);

					int rnd = _random.nextInt(100) + 1;
					int enchant_chance_wepon;
					if (enchant_level >= 9) {
						enchant_chance_wepon = (100 + 3 * Config.ENCHANT_CHANCE_WEAPON) / 6;
					} else {
						enchant_chance_wepon = (100 + 3 * Config.ENCHANT_CHANCE_WEAPON) / 3;
					}

					if (rnd < enchant_chance_wepon) {
						int randomEnchantLevel = RandomELevel(l1iteminstance1,
								itemId);
						SuccessEnchant(pc, l1iteminstance1, client,
								randomEnchantLevel);
					} else if (enchant_level >= 9
							&& rnd < (enchant_chance_wepon * 2)) {
						// \f1%0が%2と強烈に%1光りましたが、幸い無事にすみました。
						pc.sendPackets(new S_ServerMessage(160, l1iteminstance1
								.getLogName(), "$245", "$248"));
					} else {
						FailureEnchant(pc, l1iteminstance1, client);
					}
				}
			} else if (itemId == 41429 || itemId == 41430 || itemId == 41431
					|| itemId == 41432) { // 風の武器強化スクロール～火の武器強化スクロール
				if (l1iteminstance1 == null
						|| l1iteminstance1.getItem().getType2() != 1) {
					pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
					return;
				}
				int safeEnchant = l1iteminstance1.getItem().get_safeenchant();
				if (safeEnchant < 0) { // 強化不可
					pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
					return;
				}

				if (l1iteminstance1.isSealed()) { // 封印された装備強化不可
					pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
					return;
				}

				// 0:無属性 1:地 2:火 4:水 8:風
				int oldAttrEnchantKind = l1iteminstance1.getAttrEnchantKind();
				int oldAttrEnchantLevel = l1iteminstance1.getAttrEnchantLevel();

				boolean isSameAttr = false; // スクロールと強化済みの属性が同一か
				if (itemId == 41429 && oldAttrEnchantKind == 8
						|| itemId == 41430 && oldAttrEnchantKind == 1
						|| itemId == 41431 && oldAttrEnchantKind == 4
						|| itemId == 41432 && oldAttrEnchantKind == 2) { // 同じ属性
					isSameAttr = true;
				}
				if (isSameAttr && oldAttrEnchantLevel >= 3) {
					pc.sendPackets(new S_ServerMessage(1453)); // これ以上は強化できません。
					return;
				}

				int rnd = _random.nextInt(100) + 1;
				if (Config.ATTR_ENCHANT_CHANCE >= rnd) {
					pc.sendPackets(new S_ServerMessage(1410, l1iteminstance1
							.getLogName(), "$245", "$247")); // f1%0に強力な魔法の力が染み入ります。
					int newAttrEnchantKind = 0;
					int newAttrEnchantLevel = 0;
					if (isSameAttr) { // 同じ属性なら+1
						newAttrEnchantLevel = oldAttrEnchantLevel + 1;
					} else { // 異なる属性なら1
						newAttrEnchantLevel = 1;
					}
					if (itemId == 41429) { // 風の武器強化スクロール
						newAttrEnchantKind = 8;
					} else if (itemId == 41430) { // 地の武器強化スクロール
						newAttrEnchantKind = 1;
					} else if (itemId == 41431) { // 水の武器強化スクロール
						newAttrEnchantKind = 4;
					} else if (itemId == 41432) { // 火の武器強化スクロール
						newAttrEnchantKind = 2;
					}
					l1iteminstance1.setAttrEnchantKind(newAttrEnchantKind);
					pc.getInventory().updateItem(l1iteminstance1,
							L1PcInventory.COL_ATTR_ENCHANT_KIND);
					pc.getInventory().saveItem(l1iteminstance1);
					l1iteminstance1.setAttrEnchantLevel(newAttrEnchantLevel);
					pc.getInventory().updateItem(l1iteminstance1,
							L1PcInventory.COL_ATTR_ENCHANT_LEVEL);
					pc.getInventory().saveItem(l1iteminstance1);
				} else {
					pc.sendPackets(new S_ServerMessage(1411, l1iteminstance1
							.getLogName(), "$245", "$247")); // f1%0に魔法が入り込めません。
				}
				pc.getInventory().removeItem(l1iteminstance, 1);
			} else if (itemId == 49304 || itemId == 49305 || itemId == 49306
					|| itemId == 49307 || itemId == 49308 || itemId == 49309) { // マリスエレメント武器(etcitem)
				int weapon_id = 0;
				int newAttrEnchantKind[] = { 1, 2, 4, 8 };

				switch (itemId) {
				case 49304:
					weapon_id = 276; // マリス エレメント キーリンク
					break;
				case 49305:
					weapon_id = 277; // マリス エレメント チェーンソード
					break;
				case 49306:
					weapon_id = 278; // マリス エレメント クロウ
					break;
				case 49307:
					weapon_id = 279; // マリス エレメント スタッフ
					break;
				case 49308:
					weapon_id = 280; // マリス エレメント ボウ
					break;
				case 49309:
					weapon_id = 281; // マリス エレメント ソード
					break;
				}
				pc.getInventory().removeItem(l1iteminstance, 1);

				L1ItemInstance item = ItemTable.getInstance().createItem(
						weapon_id);
				item.setCount(1);
				if (item != null) {
					if (pc.getInventory().checkAddItem(item, 1) == L1Inventory.OK) {
						pc.getInventory().storeItem(item);
					} else { // 持てない場合は地面に落とす 処理のキャンセルはしない（不正防止）
						L1World.getInstance().getInventory(pc.getX(),
								pc.getY(), pc.getMapId()).storeItem(item);
					}
				} else {
					return;
				}
				pc.sendPackets(new S_ServerMessage(1410, item.getLogName(),
						"$245", "$247")); // f1%0に強力な魔法の力が染み入ります。

				int rnd_attr = _random.nextInt(newAttrEnchantKind.length); // 属性の確定
				// 属性の付与
				item.setAttrEnchantKind(newAttrEnchantKind[rnd_attr]);
				pc.getInventory().updateItem(item,
						L1PcInventory.COL_ATTR_ENCHANT_KIND);
				pc.getInventory().saveItem(item);
				item.setAttrEnchantLevel(1);
				pc.getInventory().updateItem(item,
						L1PcInventory.COL_ATTR_ENCHANT_LEVEL);
				pc.getInventory().saveItem(item);

			} else if (itemId == 40078
					|| itemId == L1ItemId.SCROLL_OF_ENCHANT_ARMOR
					|| itemId == 40129 || itemId == 140129
					|| itemId == L1ItemId.B_SCROLL_OF_ENCHANT_ARMOR
					|| itemId == L1ItemId.C_SCROLL_OF_ENCHANT_ARMOR
					|| itemId == 40127) { // 防具強化スクロール
				if (l1iteminstance1 == null
						|| l1iteminstance1.getItem().getType2() != 2) {
					pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
					return;
				}

				int safe_enchant = ((L1Armor) l1iteminstance1.getItem())
						.get_safeenchant();
				if (safe_enchant < 0) { // 強化不可
					pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
					return;
				}

				if (l1iteminstance1.isSealed()) { // 封印された装備強化不可
					pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
					return;
				}

				int armorId = l1iteminstance1.getItem().getItemId();
				if (armorId == 20161 || armorId >= 21035 && armorId <= 21038) { // イリュージョン防具
					if (itemId == 40127) { // イリュージョン防具強化スクロール
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
						return;
					}
				}
				if (itemId == 40127) { // イリュージョン防具強化スクロール
					if (armorId == 20161 || armorId >= 21035
							&& armorId <= 21038) { // イリュージョン防具
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
						return;
					}
				}

				int enchant_level = l1iteminstance1.getEnchantLevel();
				if (itemId == L1ItemId.C_SCROLL_OF_ENCHANT_ARMOR) { // c-zel
					pc.getInventory().removeItem(l1iteminstance, 1);
					if (enchant_level < -6) {
						// -7以上はできない。
						FailureEnchant(pc, l1iteminstance1, client);
					} else {
						SuccessEnchant(pc, l1iteminstance1, client, -1);
					}
				} else if (enchant_level < safe_enchant) {
					pc.getInventory().removeItem(l1iteminstance, 1);
					SuccessEnchant(pc, l1iteminstance1, client, RandomELevel(
							l1iteminstance1, itemId));
				} else {
					pc.getInventory().removeItem(l1iteminstance, 1);
					int rnd = _random.nextInt(100) + 1;
					int enchant_chance_armor;
					int enchant_level_tmp;
					if (safe_enchant == 0) { // 骨、ブラックミスリル用補正
						enchant_level_tmp = enchant_level + 2;
					} else {
						enchant_level_tmp = enchant_level;
					}
					if (enchant_level >= 9) {
						enchant_chance_armor = (100 + enchant_level_tmp
								* Config.ENCHANT_CHANCE_ARMOR)
								/ (enchant_level_tmp * 2);
					} else {
						enchant_chance_armor = (100 + enchant_level_tmp
								* Config.ENCHANT_CHANCE_ARMOR)
								/ enchant_level_tmp;
					}

					if (rnd < enchant_chance_armor) {
						int randomEnchantLevel = RandomELevel(l1iteminstance1,
								itemId);
						SuccessEnchant(pc, l1iteminstance1, client,
								randomEnchantLevel);
					} else if (enchant_level >= 9
							&& rnd < (enchant_chance_armor * 2)) {
						String item_name_id = l1iteminstance1.getName();
						String pm = "";
						String msg = "";
						if (enchant_level > 0) {
							pm = "+";
						}
						msg = (new StringBuilder()).append(pm + enchant_level)
								.append(" ").append(item_name_id).toString();
						// \f1%0が%2と強烈に%1光りましたが、幸い無事にすみました。
						pc.sendPackets(new S_ServerMessage(160, msg, "$252",
								"$248"));
					} else {
						FailureEnchant(pc, l1iteminstance1, client);
					}
				}
			} else if (l1iteminstance.getItem().getType2() == 0) { // 種別：その他のアイテム
				int item_minlvl = ((L1EtcItem) l1iteminstance.getItem())
						.getMinLevel();
				int item_maxlvl = ((L1EtcItem) l1iteminstance.getItem())
						.getMaxLevel();
				if (item_minlvl != 0 && item_minlvl > pc.getLevel()
						&& !pc.isGm()) {
					pc.sendPackets(new S_ServerMessage(318, String
							.valueOf(item_minlvl))); // このアイテムは%0レベル以上にならなければ使用できません。
					return;
				} else if (item_maxlvl != 0 && item_maxlvl < pc.getLevel()
						&& !pc.isGm()) {
					pc.sendPackets(new S_ServerMessage(673, String
							.valueOf(item_maxlvl))); // このアイテムは%dレベル以上のみ使用できます。
					return;
				}

				if ((itemId == 40576 && !pc.isElf()) // 魂の結晶の破片（白）
						|| (itemId == 40577 && !pc.isWizard()) // 魂の結晶の破片（黒）
						|| (itemId == 40578 && !pc.isKnight())) { // 魂の結晶の破片（赤）
					pc.sendPackets(new S_ServerMessage(264)); // \f1あなたのクラスではこのアイテムは使用できません。
					return;
				}

				if (l1iteminstance.getItem().getType() == 0) { // アロー
					pc.getInventory().setArrow(
							l1iteminstance.getItem().getItemId());
					pc.sendPackets(new S_ServerMessage(452, l1iteminstance
							.getLogName())); // %0が選択されました。
				} else if (l1iteminstance.getItem().getType() == 15) { // スティング
					pc.getInventory().setSting(
							l1iteminstance.getItem().getItemId());
					pc.sendPackets(new S_ServerMessage(452, // %0が選択されました。
							l1iteminstance.getLogName()));
				} else if (l1iteminstance.getItem().getType() == 16) { // treasure_box
					L1TreasureBox box = L1TreasureBox.get(itemId);

					if (itemId == 50499) {// デスマッチ記念品の箱
						if (// pc.getMap().getBaseMapId()!=5153){
						pc.getMapId() != 5153) {
							return;
						}
					}

					if (box != null) {
						if (box.open(pc)) {
							L1EtcItem temp = (L1EtcItem) l1iteminstance
									.getItem();
							if (temp.get_delayEffect() > 0) {
								isDelayEffect = true;
							} else {
								pc.getInventory().removeItem(
										l1iteminstance.getId(), 1);
							}
						}
					}
					if (itemId == 50500) { // ドルーガバッグ
						if (l1iteminstance.getChargeCount() >= 1) {
							l1iteminstance.setChargeCount(l1iteminstance
									.getChargeCount() - 1);
							pc.getInventory().updateItem(l1iteminstance,
									L1PcInventory.COL_CHARGE_COUNT);
						}
					}
				} else if (l1iteminstance.getItem().getType() == 2) { // light系アイテム
					if (l1iteminstance.getRemainingTime() <= 0
							&& itemId != 40004) {
						return;
					}
					if (l1iteminstance.isNowLighting()) {
						l1iteminstance.setNowLighting(false);
						pc.updateLight();
					} else {
						l1iteminstance.setNowLighting(true);
						pc.updateLight();
					}
					pc.sendPackets(new S_ItemName(l1iteminstance));
				} else if (itemId == 40003) { // ランタン オイル
					for (L1ItemInstance lightItem : pc.getInventory()
							.getItems()) {
						if (lightItem.getItem().getItemId() == 40002) {
							lightItem.setRemainingTime(l1iteminstance.getItem()
									.getLightFuel());
							pc.sendPackets(new S_ItemName(lightItem));
							pc.sendPackets(new S_ServerMessage(230)); // ランタンにオイルを注ぎました。
							break;
						}
					}
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 43000) { // 復活のポーション（Lv99キャラのみが使用可能/Lv1に戻る効果
					// ）
					pc.setExp(1);
					pc.resetLevel();
					pc.setBonusStats(0);
					pc.sendPackets(new S_SkillSound(pcObjid, 191));
					pc.broadcastPacket(new S_SkillSound(pcObjid, 191));
					pc.sendPackets(new S_OwnCharStatus(pc));
					pc.getInventory().removeItem(l1iteminstance, 1);
					pc.sendPackets(new S_ServerMessage(822)); // 独自アイテムですので、メッセージは適当です。
					pc.save(); // DBにキャラクター情報を書き込む
				} else if (itemId == 40033) { // エリクサー:腕力
					if (pc.getBaseStr() < 35 && pc.getElixirStats() < 5) {
						pc.addBaseStr((byte) 1); // 素のSTR値に+1
						pc.setElixirStats(pc.getElixirStats() + 1);
						pc.getInventory().removeItem(l1iteminstance, 1);
						pc.sendPackets(new S_OwnCharStatus2(pc));
						pc.save();
						; // DBにキャラクター情報を書き込む
					} else {
						pc.sendPackets(new S_ServerMessage(481)); // \f1一つの能力値の最大値は25です。他の能力値を選択してください。
					}
				} else if (itemId == 40034) { // エリクサー:体力
					if (pc.getBaseCon() < 35 && pc.getElixirStats() < 5) {
						pc.addBaseCon((byte) 1); // 素のCON値に+1
						pc.setElixirStats(pc.getElixirStats() + 1);
						pc.getInventory().removeItem(l1iteminstance, 1);
						pc.sendPackets(new S_OwnCharStatus2(pc));
						pc.save();
						; // DBにキャラクター情報を書き込む
					} else {
						pc.sendPackets(new S_ServerMessage(481)); // \f1一つの能力値の最大値は25です。他の能力値を選択してください。
					}
				} else if (itemId == 40035) { // エリクサー:機敏
					if (pc.getBaseDex() < 35 && pc.getElixirStats() < 5) {
						pc.addBaseDex((byte) 1); // 素のDEX値に+1
						pc.resetBaseAc();
						pc.setElixirStats(pc.getElixirStats() + 1);
						pc.getInventory().removeItem(l1iteminstance, 1);
						pc.sendPackets(new S_OwnCharStatus2(pc));
						pc.save();
						; // DBにキャラクター情報を書き込む
					} else {
						pc.sendPackets(new S_ServerMessage(481)); // \f1一つの能力値の最大値は25です。他の能力値を選択してください。
					}
				} else if (itemId == 40036) { // エリクサー:知力
					if (pc.getBaseInt() < 35 && pc.getElixirStats() < 5) {
						pc.addBaseInt((byte) 1); // 素のINT値に+1
						pc.setElixirStats(pc.getElixirStats() + 1);
						pc.getInventory().removeItem(l1iteminstance, 1);
						pc.sendPackets(new S_OwnCharStatus2(pc));
						pc.save();
						; // DBにキャラクター情報を書き込む
					} else {
						pc.sendPackets(new S_ServerMessage(481)); // \f1一つの能力値の最大値は25です。他の能力値を選択してください。
					}
				} else if (itemId == 40037) { // エリクサー:精神
					if (pc.getBaseWis() < 35 && pc.getElixirStats() < 5) {
						pc.addBaseWis((byte) 1); // 素のWIS値に+1
						pc.resetBaseMr();
						pc.setElixirStats(pc.getElixirStats() + 1);
						pc.getInventory().removeItem(l1iteminstance, 1);
						pc.sendPackets(new S_OwnCharStatus2(pc));
						pc.save();
						; // DBにキャラクター情報を書き込む
					} else {
						pc.sendPackets(new S_ServerMessage(481)); // \f1一つの能力値の最大値は25です。他の能力値を選択してください。
					}
				} else if (itemId == 40038) { // エリクサー:魅力
					if (pc.getBaseCha() < 35 && pc.getElixirStats() < 5) {
						pc.addBaseCha((byte) 1); // 素のCHA値に+1
						pc.setElixirStats(pc.getElixirStats() + 1);
						pc.getInventory().removeItem(l1iteminstance, 1);
						pc.sendPackets(new S_OwnCharStatus2(pc));
						pc.save();
						; // DBにキャラクター情報を書き込む
					} else {
						pc.sendPackets(new S_ServerMessage(481)); // \f1一つの能力値の最大値は25です。他の能力値を選択してください。
					}
				}
				// レッドポーション、濃縮体力回復剤、象牙の塔の体力回復剤
				else if (itemId == L1ItemId.POTION_OF_HEALING
						|| itemId == L1ItemId.CONDENSED_POTION_OF_HEALING
						|| itemId == 40029) {
					UseHeallingPotion(pc, 15, 189);
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 40022) { // 古代の体力回復剤
					UseHeallingPotion(pc, 20, 189);
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == L1ItemId.POTION_OF_EXTRA_HEALING
						|| itemId == L1ItemId.CONDENSED_POTION_OF_EXTRA_HEALING) {
					UseHeallingPotion(pc, 45, 194);
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 40023) { // 古代の高級体力回復剤
					UseHeallingPotion(pc, 30, 194);
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == L1ItemId.POTION_OF_GREATER_HEALING
						|| itemId == L1ItemId.CONDENSED_POTION_OF_GREATER_HEALING) {
					UseHeallingPotion(pc, 75, 197);
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 40024) { // 古代の強力体力回復剤
					UseHeallingPotion(pc, 55, 197);
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 40506) { // エントの実
					UseHeallingPotion(pc, 70, 197);
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 40026 || itemId == 40027
						|| itemId == 40028) { // ジュース
					UseHeallingPotion(pc, 25, 189);
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 40058) { // きつね色のパン
					UseHeallingPotion(pc, 30, 189);
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 40071) { // 黒こげのパン
					UseHeallingPotion(pc, 70, 197);
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 40734) { // 信頼のコイン
					UseHeallingPotion(pc, 50, 189);
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == L1ItemId.B_POTION_OF_HEALING) {
					UseHeallingPotion(pc, 25, 189);
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == L1ItemId.C_POTION_OF_HEALING) {
					UseHeallingPotion(pc, 10, 189);
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == L1ItemId.B_POTION_OF_EXTRA_HEALING) { // 祝福されたオレンジ
					// ポーション
					UseHeallingPotion(pc, 55, 194);
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == L1ItemId.B_POTION_OF_GREATER_HEALING) { // 祝福されたクリアー
					// ポーション
					UseHeallingPotion(pc, 85, 197);
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 140506) { // 祝福されたエントの実
					UseHeallingPotion(pc, 80, 197);
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 40043) { // 兎の肝
					UseHeallingPotion(pc, 600, 189);
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 41403) { // クジャクの食糧
					UseHeallingPotion(pc, 300, 189);
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId >= 41417 && itemId <= 41421) { // 「アデンの夏」イベント限定アイテム
					UseHeallingPotion(pc, 90, 197);
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 41337) { // 祝福された麦パン
					UseHeallingPotion(pc, 85, 197);
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 49302) { // TODO 凝縮した化合物
					UseHeallingPotion(pc, 55, 197);
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 40858) { // liquor（酒）
					pc.setDrink(true);
					pc.sendPackets(new S_Liquor(pc.getId(), 1));
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == L1ItemId.POTION_OF_CURE_POISON
						|| itemId == 40507) { // シアンポーション、エントの枝
					if (pc.hasSkillEffect(71) == true) { // ディケイポーションの状態
						pc.sendPackets(new S_ServerMessage(698)); // 魔力によって何も飲むことができません。
					} else {
						cancelAbsoluteBarrier(pc); // アブソルート バリアの解除
						pc.sendPackets(new S_SkillSound(pc.getId(), 192));
						pc.broadcastPacket(new S_SkillSound(pc.getId(), 192));
						if (itemId == L1ItemId.POTION_OF_CURE_POISON) {
							pc.getInventory().removeItem(l1iteminstance, 1);
						} else if (itemId == 40507) {
							pc.getInventory().removeItem(l1iteminstance, 1);
						}

						pc.curePoison();
					}
				} else if (itemId == L1ItemId.POTION_OF_HASTE_SELF
						|| itemId == L1ItemId.B_POTION_OF_HASTE_SELF
						|| itemId == 40018 // 強化グリーン ポーション
						|| itemId == 140018 // 祝福された強化グリーン ポーション
						|| itemId == 40039 // ワイン
						|| itemId == 40040 // ウイスキー
						|| itemId == 40030 // 象牙の塔のヘイスト ポーション
						|| itemId == 41338 // 祝福されたワイン
						|| itemId == 41261 // おむすび
						|| itemId == 41262 // 焼き鳥
						|| itemId == 41268 // ピザのピース
						|| itemId == 41269 // 焼きもろこし
						|| itemId == 41271 // ポップコーン
						|| itemId == 41272 // おでん
						|| itemId == 41273 // ワッフル
						|| itemId == 41342) { // メデューサの血
					useGreenPotion(pc, itemId);
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == L1ItemId.POTION_OF_EMOTION_BRAVERY // ブレイブポーション
						|| itemId == L1ItemId.B_POTION_OF_EMOTION_BRAVERY // 祝福されたブレイブポーション
						|| itemId == 41415) { // 強化ブレイブポーション
					if (pc.isKnight()) {
						useBravePotion(pc, itemId);
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
					}
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 49158) { // ユグドラの実
					if (pc.isDragonKnight() || pc.isIllusionist()) {
						useBravePotion(pc, itemId);
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
					}
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 40068 // エルヴン ワッフル
						|| itemId == 140068) { // 祝福されたエルヴン ワッフル
					if (pc.isElf()) {
						useBravePotion(pc, itemId);
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
					}
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 40031) { // イビル ブラッド
					if (pc.isCrown()) {
						useBravePotion(pc, itemId);
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
					}
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 40733) { // 名誉のコイン
					useBravePotion(pc, itemId);
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 40066 || itemId == 41413) { // お餅、月餅
					pc.sendPackets(new S_ServerMessage(338, "$1084")); // あなたの%0が回復していきます。
					pc.setCurrentMp(pc.getCurrentMp()
							+ (7 + _random.nextInt(6))); // 7~12
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 40067 || itemId == 41414) { // よもぎ餅、福餅
					pc.sendPackets(new S_ServerMessage(338, "$1084")); // あなたの%0が回復していきます。
					pc.setCurrentMp(pc.getCurrentMp()
							+ (15 + _random.nextInt(16))); // 15~30
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 40735) { // 勇気のコイン
					pc.sendPackets(new S_ServerMessage(338, "$1084")); // あなたの%0が回復していきます。
					pc.setCurrentMp(pc.getCurrentMp() + 60);
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 40042) { // スピリットポーション
					pc.sendPackets(new S_ServerMessage(338, "$1084")); // あなたの%0が回復していきます。
					pc.setCurrentMp(pc.getCurrentMp() + 50);
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 41404) { // クジャクの霊薬
					pc.sendPackets(new S_ServerMessage(338, "$1084")); // あなたの%0が回復していきます。
					pc.setCurrentMp(pc.getCurrentMp()
							+ (80 + _random.nextInt(21))); // 80~100
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 41412) { // 金のチョンズ
					pc.sendPackets(new S_ServerMessage(338, "$1084")); // あなたの%0が回復していきます。
					pc.setCurrentMp(pc.getCurrentMp()
							+ (5 + _random.nextInt(16))); // 5~20
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 40032 || itemId == 40041
						|| itemId == 41344) { // エヴァの祝福、マーメイドの鱗、水の精粋
					useBlessOfEva(pc, itemId);
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == L1ItemId.POTION_OF_MANA // ブルー ポーション
						|| itemId == L1ItemId.B_POTION_OF_MANA // 祝福されたブルー
						// ポーション
						|| itemId == 40736) { // 知恵のコイン
					useBluePotion(pc, itemId);
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == L1ItemId.POTION_OF_EMOTION_WISDOM // ウィズダム
						// ポーション
						|| itemId == L1ItemId.B_POTION_OF_EMOTION_WISDOM) { // 祝福されたウィズダム
					// ポーション
					if (pc.isWizard()) {
						useWisdomPotion(pc, itemId);
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでし。
					}
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == L1ItemId.POTION_OF_BLINDNESS) { // オペイクポーション
					useBlindPotion(pc);
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 40088 // 変身スクロール
						|| itemId == 40096 // 象牙の塔の変身スクロール
						|| itemId == 140088) { // 祝福された変身スクロール
					if (usePolyScroll(pc, itemId, s)) {
						pc.getInventory().removeItem(l1iteminstance, 1);
					} else {
						pc.sendPackets(new S_ServerMessage(181)); // \
						// f1そのようなモンスターには変身できません
						// 。
					}
				} else if (itemId == 41154 // 闇の鱗
						|| itemId == 41155 // 烈火の鱗
						|| itemId == 41156 // 背徳者の鱗
						|| itemId == 41157 // 憎悪の鱗
						|| itemId == 49220) { // オーク密使変身スクロール
					usePolyScale(pc, itemId);
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 41143 // ラバーボーンヘッド変身ポーション
						|| itemId == 41144 // ラバーボーンアーチャー変身ポーション
						|| itemId == 41145 // ラバーボーンナイフ変身ポーション
						|| itemId == 49149 // シャルナの変身スクロール（レベル30）
						|| itemId == 49150 // シャルナの変身スクロール（レベル40）
						|| itemId == 49151 // シャルナの変身スクロール（レベル52）
						|| itemId == 49152 // シャルナの変身スクロール（レベル55）
						|| itemId == 49153 // シャルナの変身スクロール（レベル60）
						|| itemId == 49154 // シャルナの変身スクロール（レベル65）
						|| itemId == 49155) { // シャルナの変身スクロール（レベル70）
					usePolyPotion(pc, itemId);
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 40317) { // 砥石
					// 武器か防具の場合のみ
					if (l1iteminstance1.getItem().getType2() != 0
							&& l1iteminstance1.getDurability() > 0) {
						String msg0;
						pc.getInventory().recoveryDamage(l1iteminstance1);
						msg0 = l1iteminstance1.getLogName();
						if (l1iteminstance1.getDurability() == 0) {
							pc.sendPackets(new S_ServerMessage(464, msg0)); // %0%sは新品同様の状態になりました。
						} else {
							pc.sendPackets(new S_ServerMessage(463, msg0)); // %0の状態が良くなりました。
						}
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした
						// 。
					}
					pc.getInventory().removeItem(l1iteminstance, 1);

				} else if (itemId == 50501) { // ドラゴンキー(レイド選択コード不明)
					L1SpawnUtil.spawn(pc, 91051, 0, 7200000); // 120*60*1000 =
					// 2時間
					pc.getInventory().removeItem(l1iteminstance, 1);

				} else if (itemId == 40097 || itemId == 40119
						|| itemId == 140119 || itemId == 140329) { // 解呪スクロール、
					// 原住民のトーテム
					for (L1ItemInstance eachItem : pc.getInventory().getItems()) {
						if (eachItem.getItem().getBless() != 2
								&& eachItem.getItem().getBless() != 130) {
							continue;
						}
						if (!eachItem.isEquipped()
								&& (itemId == 40119 || itemId == 40097)) {
							// n解呪は装備しているものしか解呪しない
							continue;
						}
						int id_normal = eachItem.getItemId() - 200000;
						L1Item template = ItemTable.getInstance().getTemplate(
								id_normal);
						if (template == null) {
							continue;
						}
						if (pc.getInventory().checkItem(id_normal)
								&& template.isStackable()) {
							pc.getInventory().storeItem(id_normal,
									eachItem.getCount());
							pc.getInventory().removeItem(eachItem,
									eachItem.getCount());
						} else {
							eachItem.setItem(template);
							pc.getInventory().updateItem(eachItem,
									L1PcInventory.COL_ITEMID);
							pc.getInventory().saveItem(eachItem);
						}
					}
					pc.getInventory().removeItem(l1iteminstance, 1);
					pc.sendPackets(new S_ServerMessage(155)); // \f1誰かが助けてくれたようです
					// 。
				} else if (itemId == 40126 || itemId == 40098) { // 確認スクロール
					if (!l1iteminstance1.isIdentified()) {
						l1iteminstance1.setIdentified(true);
						pc.getInventory().updateItem(l1iteminstance1,
								L1PcInventory.COL_IS_ID);
					}
					pc.sendPackets(new S_IdentifyDesc(l1iteminstance1));
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 41036) { // 糊
					int diaryId = l1iteminstance1.getItem().getItemId();
					if (diaryId >= 41038 && 41047 >= diaryId) {
						if ((_random.nextInt(99) + 1) <= Config.CREATE_CHANCE_DIARY) {
							L1ItemUtil.createNewItem(pc, diaryId + 10, 1);
						} else {
							pc.sendPackets(new S_ServerMessage(158,
									l1iteminstance1.getName())); // \f1%0
							// が蒸発してなくなりました
							// 。
						}
						pc.getInventory().removeItem(l1iteminstance1, 1);
						pc.getInventory().removeItem(l1iteminstance, 1);
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした
						// 。
					}
				} else if (itemId >= 41048 && 41055 >= itemId) {
					// 糊付けされた航海日誌ページ：１～８ページ
					int logbookId = l1iteminstance1.getItem().getItemId();
					if (logbookId == (itemId + 8034)) {
						L1ItemUtil.createNewItem(pc, logbookId + 2, 1);
						pc.getInventory().removeItem(l1iteminstance1, 1);
						pc.getInventory().removeItem(l1iteminstance, 1);
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした
						// 。
					}
				} else if (itemId == 41056 || itemId == 41057) {
					// 糊付けされた航海日誌ページ：９，１０ページ
					int logbookId = l1iteminstance1.getItem().getItemId();
					if (logbookId == (itemId + 8034)) {
						L1ItemUtil.createNewItem(pc, 41058, 1);
						pc.getInventory().removeItem(l1iteminstance1, 1);
						pc.getInventory().removeItem(l1iteminstance, 1);
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした
						// 。
					}
				} else if (itemId == 40925) { // 浄化のポーション
					int earingId = l1iteminstance1.getItem().getItemId();
					if (earingId >= 40987 && 40989 >= earingId) { // 呪われたブラックイアリング
						if (_random.nextInt(100) < Config.CREATE_CHANCE_RECOLLECTION) {
							L1ItemUtil.createNewItem(pc, earingId + 186, 1);
						} else {
							pc.sendPackets(new S_ServerMessage(158,
									l1iteminstance1.getName())); // \f1%0
							// が蒸発してなくなりました
							// 。
						}
						pc.getInventory().removeItem(l1iteminstance1, 1);
						pc.getInventory().removeItem(l1iteminstance, 1);
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした
						// 。
					}
				} else if (itemId >= 40926 && 40929 >= itemId) {
					// ミステリアスポーション（１～４段階）
					int earing2Id = l1iteminstance1.getItem().getItemId();
					int potion1 = 0;
					int potion2 = 0;
					if (earing2Id >= 41173 && 41184 >= earing2Id) {
						// イアリング類
						if (itemId == 40926) {
							potion1 = 247;
							potion2 = 249;
						} else if (itemId == 40927) {
							potion1 = 249;
							potion2 = 251;
						} else if (itemId == 40928) {
							potion1 = 251;
							potion2 = 253;
						} else if (itemId == 40929) {
							potion1 = 253;
							potion2 = 255;
						}
						if (earing2Id >= (itemId + potion1)
								&& (itemId + potion2) >= earing2Id) {
							if ((_random.nextInt(99) + 1) < Config.CREATE_CHANCE_MYSTERIOUS) {
								L1ItemUtil.createNewItem(pc, (earing2Id - 12),
										1);
								pc.getInventory()
										.removeItem(l1iteminstance1, 1);
								pc.getInventory().removeItem(l1iteminstance, 1);
							} else {
								pc.sendPackets(new S_ServerMessage(160,
										l1iteminstance1.getName()));
								// \f1%0が%2強烈に%1光りましたが、幸い無事にすみました。
								pc.getInventory().removeItem(l1iteminstance, 1);
							}
						} else {
							pc.sendPackets(new S_ServerMessage(79)); // \
							// f1何も起きませんでした
							// 。
						}
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした
						// 。
					}
				} else if (itemId >= 40931 && 40942 >= itemId) {
					// 加工された宝石類（サファイア・ルビー・エメラルド）
					int earing3Id = l1iteminstance1.getItem().getItemId();
					int earinglevel = 0;
					if (earing3Id >= 41161 && 41172 >= earing3Id) {
						// ミステリアスイアリング類
						if (earing3Id == (itemId + 230)) {
							if ((_random.nextInt(99) + 1) < Config.CREATE_CHANCE_PROCESSING) {
								if (earing3Id == 41161) {
									earinglevel = 21014;
								} else if (earing3Id == 41162) {
									earinglevel = 21006;
								} else if (earing3Id == 41163) {
									earinglevel = 21007;
								} else if (earing3Id == 41164) {
									earinglevel = 21015;
								} else if (earing3Id == 41165) {
									earinglevel = 21009;
								} else if (earing3Id == 41166) {
									earinglevel = 21008;
								} else if (earing3Id == 41167) {
									earinglevel = 21016;
								} else if (earing3Id == 41168) {
									earinglevel = 21012;
								} else if (earing3Id == 41169) {
									earinglevel = 21010;
								} else if (earing3Id == 41170) {
									earinglevel = 21017;
								} else if (earing3Id == 41171) {
									earinglevel = 21013;
								} else if (earing3Id == 41172) {
									earinglevel = 21011;
								}
								L1ItemUtil.createNewItem(pc, earinglevel, 1);
							} else {
								pc.sendPackets(new S_ServerMessage(158,
										l1iteminstance1.getName()));
								// \f1%0が蒸発してなくなりました。
							}
							pc.getInventory().removeItem(l1iteminstance1, 1);
							pc.getInventory().removeItem(l1iteminstance, 1);
						} else {
							pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
						}
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした
						// 。
					}
				} else if (itemId >= 40943 && 40958 >= itemId) {
					// 加工されたダイアモンド（ウォータ・アース・ファイアー・ウインド）
					int ringId = l1iteminstance1.getItem().getItemId();
					int ringlevel = 0;
					int gmas = 0;
					int gmam = 0;
					if (ringId >= 41185 && 41200 >= ringId) {
						// 細工されたリング類
						if (itemId == 40943 || itemId == 40947
								|| itemId == 40951 || itemId == 40955) {
							gmas = 443;
							gmam = 447;
						} else if (itemId == 40944 || itemId == 40948
								|| itemId == 40952 || itemId == 40956) {
							gmas = 442;
							gmam = 446;
						} else if (itemId == 40945 || itemId == 40949
								|| itemId == 40953 || itemId == 40957) {
							gmas = 441;
							gmam = 445;
						} else if (itemId == 40946 || itemId == 40950
								|| itemId == 40954 || itemId == 40958) {
							gmas = 444;
							gmam = 448;
						}
						if (ringId == (itemId + 242)) {
							if ((_random.nextInt(99) + 1) < Config.CREATE_CHANCE_PROCESSING_DIAMOND) {
								if (ringId == 41185) {
									ringlevel = 20435;
								} else if (ringId == 41186) {
									ringlevel = 20436;
								} else if (ringId == 41187) {
									ringlevel = 20437;
								} else if (ringId == 41188) {
									ringlevel = 20438;
								} else if (ringId == 41189) {
									ringlevel = 20439;
								} else if (ringId == 41190) {
									ringlevel = 20440;
								} else if (ringId == 41191) {
									ringlevel = 20441;
								} else if (ringId == 41192) {
									ringlevel = 20442;
								} else if (ringId == 41193) {
									ringlevel = 20443;
								} else if (ringId == 41194) {
									ringlevel = 20444;
								} else if (ringId == 41195) {
									ringlevel = 20445;
								} else if (ringId == 41196) {
									ringlevel = 20446;
								} else if (ringId == 41197) {
									ringlevel = 20447;
								} else if (ringId == 41198) {
									ringlevel = 20448;
								} else if (ringId == 41199) {
									ringlevel = 20449;
								} else if (ringId == 41200) {
									ringlevel = 20450;
								}
								pc.sendPackets(new S_ServerMessage(gmas,
										l1iteminstance1.getName()));
								L1ItemUtil.createNewItem(pc, ringlevel, 1);
								pc.getInventory()
										.removeItem(l1iteminstance1, 1);
								pc.getInventory().removeItem(l1iteminstance, 1);
							} else {
								pc.sendPackets(new S_ServerMessage(gmam,
										l1iteminstance.getName()));
								pc.getInventory().removeItem(l1iteminstance, 1);
							}
						} else {
							pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
						}
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
					}
				} else if (itemId == 41029) { // 召喚球の欠片
					int dantesId = l1iteminstance1.getItem().getItemId();
					if (dantesId >= 41030 && 41034 >= dantesId) { // 召喚球のコア・各段階
						if ((_random.nextInt(99) + 1) < Config.CREATE_CHANCE_DANTES) {
							L1ItemUtil.createNewItem(pc, dantesId + 1, 1);
						} else {
							pc.sendPackets(new S_ServerMessage(158,
									l1iteminstance1.getName())); // \f1%0が蒸発してなくなりました。
						}
						pc.getInventory().removeItem(l1iteminstance1, 1);
						pc.getInventory().removeItem(l1iteminstance, 1);
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
					}
				} else if (itemId == 40964) { // ダークマジックパウダー
					int historybookId = l1iteminstance1.getItem().getItemId();
					if (historybookId >= 41011 && 41018 >= historybookId) {
						if ((_random.nextInt(99) + 1) <= Config.CREATE_CHANCE_HISTORY_BOOK) {
							L1ItemUtil.createNewItem(pc, historybookId + 8, 1);
						} else {
							pc.sendPackets(new S_ServerMessage(158,
									l1iteminstance1.getName())); // \f1%0
							// が蒸発してなくなりました
							// 。
						}
						pc.getInventory().removeItem(l1iteminstance1, 1);
						pc.getInventory().removeItem(l1iteminstance, 1);
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした
						// 。
					}
				} else if (itemId == 40090 || itemId == 40091
						|| itemId == 40092 || itemId == 40093
						|| itemId == 40094) { // ブランク
					// スクロール(Lv1)～ブランク
					// スクロール(Lv5)
					if (pc.isWizard()) { // ウィザード
						if (itemId == 40090 && blanksc_skillid <= 7 || // ブランク
								// スクロール(Lv1)でレベル1以下の魔法
								itemId == 40091 && blanksc_skillid <= 15 || // ブランク
								// スクロール(Lv2)でレベル2以下の魔法
								itemId == 40092 && blanksc_skillid <= 22 || // ブランク
								// スクロール(Lv3)でレベル3以下の魔法
								itemId == 40093 && blanksc_skillid <= 31 || // ブランク
								// スクロール(Lv4)でレベル4以下の魔法
								itemId == 40094 && blanksc_skillid <= 39) { // ブランク
							// スクロール(Lv5)でレベル5以下の魔法
							L1ItemInstance spellsc = ItemTable.getInstance()
									.createItem(40859 + blanksc_skillid);
							if (spellsc != null) {
								if (pc.getInventory().checkAddItem(spellsc, 1) == L1Inventory.OK) {
									L1Skill l1skills = SkillTable.getInstance()
											.findBySkillId(blanksc_skillid + 1); // blanksc_skillidは0始まり
									if (pc.getCurrentHp() + 1 < l1skills
											.getHpConsume() + 1) {
										pc
												.sendPackets(new S_ServerMessage(
														279)); // \f1HPが不足していて魔法を使うことができません。
										return;
									}
									if (pc.getCurrentMp() < l1skills
											.getMpConsume()) {
										pc
												.sendPackets(new S_ServerMessage(
														278)); // \f1MPが不足していて魔法を使うことができません。
										return;
									}
									if (l1skills.getItemConsumeId() != 0) { // 材料が必要
										if (!pc.getInventory().checkItem(
												l1skills.getItemConsumeId(),
												l1skills.getItemConsumeCount())) { // 必要材料をチェック
											pc.sendPackets(new S_ServerMessage(
													299)); // \f1魔法を詠唱するための材料が足りません。
											return;
										}
									}
									pc.setCurrentHp(pc.getCurrentHp()
											- l1skills.getHpConsume());
									pc.setCurrentMp(pc.getCurrentMp()
											- l1skills.getMpConsume());
									int lawful = pc.getLawful()
											+ l1skills.getLawful();
									if (lawful > 32767) {
										lawful = 32767;
									}
									if (lawful < -32767) {
										lawful = -32767;
									}
									pc.setLawful(lawful);
									if (l1skills.getItemConsumeId() != 0) { // 材料が必要
										pc.getInventory().consumeItem(
												l1skills.getItemConsumeId(),
												l1skills.getItemConsumeCount());
									}
									pc.getInventory().removeItem(
											l1iteminstance, 1);
									pc.getInventory().storeItem(spellsc);
								}
							}
						} else {
							pc.sendPackets(new S_ServerMessage(591)); // \
							// f1スクロールがそんな強い魔法を記録するにはあまりに弱いです。
						}
					} else {
						pc.sendPackets(new S_ServerMessage(264)); // \f1あなたのクラスではこのアイテムは使用できません
						// 。
					}

					// スペルスクロール
				} else if ((itemId >= 40859 && itemId <= 40898)
						&& itemId != 40863 || itemId >= 49281
						&& itemId <= 49286) { // 40863はテレポートスクロールとして処理される
					if (spellsc_objid == pc.getId()
							&& l1iteminstance.getItem().getUseType() != 30) { // spell_buff
						pc.sendPackets(new S_ServerMessage(281)); // \
						// f1魔法が無効になりました
						// 。
						return;
					}
					pc.getInventory().removeItem(l1iteminstance, 1);
					if (spellsc_objid == 0
							&& l1iteminstance.getItem().getUseType() != 0
							&& l1iteminstance.getItem().getUseType() != 26
							&& l1iteminstance.getItem().getUseType() != 27) {
						return;
						// ターゲットがいない場合にhandleCommandsを送るとぬるぽになるためここでreturn
						// handleCommandsのほうで判断＆処理すべき部分かもしれない
					}
					cancelAbsoluteBarrier(pc); // アブソルート バリアの解除
					int skillid = itemId - 40858;
					if (itemId == 49281) { // フィジカルエンチャント：STR
						skillid = 42;
					} else if (itemId == 49282) { // ブレスウェポン
						skillid = 48;
					} else if (itemId == 49283) { // ヒールオール
						skillid = 49;
					} else if (itemId == 49284) { // ホーリーウォーク(未実装)
						skillid = 52;
					} else if (itemId == 49285) { // グレーターヘイスト
						skillid = 54;
					} else if (itemId == 49286) { // フルヒール
						skillid = 57;
					}
					L1SkillUse l1skilluse = new L1SkillUse();
					l1skilluse.handleCommands(client.getActiveChar(), skillid,
							spellsc_objid, spellsc_x, spellsc_y, null, 0,
							L1SkillUse.TYPE_SPELLSC);

				} else if (itemId >= 40373 && itemId <= 40382 // 地図各種
						|| itemId >= 40385 && itemId <= 40390) {
					pc.sendPackets(new S_ServerMessage(74, l1iteminstance
							.getLogName()));
					// \f1%0は使用できません。
					// pc.sendPackets(new S_UseMap(pc, l1iteminstance.getId(),
					// l1iteminstance.getItem().getItemId()));
				} else if (itemId == 40310 || itemId == 40730
						|| itemId == 40731 || itemId == 40732) { // 便箋(未使用)
					if (writeLetter(itemId, pc, letterCode, letterReceiver,
							letterText)) {
						pc.getInventory().removeItem(l1iteminstance, 1);
					}
				} else if (itemId == 40311) { // 血盟便箋(未使用)
					if (writeClanLetter(itemId, pc, letterCode, letterReceiver,
							letterText)) {
						pc.getInventory().removeItem(l1iteminstance, 1);
					}
				} else if (itemId == 49016 || itemId == 49018
						|| itemId == 49020 || itemId == 49022
						|| itemId == 49024) { // 便箋(未開封)
					pc.sendPackets(new S_Letter(l1iteminstance));
					l1iteminstance.setItemId(itemId + 1);
					pc.getInventory().updateItem(l1iteminstance,
							L1PcInventory.COL_ITEMID);
					pc.getInventory().saveItem(l1iteminstance);
				} else if (itemId == 49017 || itemId == 49019
						|| itemId == 49021 || itemId == 49023
						|| itemId == 49025) { // 便箋(開封済み)
					pc.sendPackets(new S_Letter(l1iteminstance));
				} else if (itemId == 40314 || itemId == 40316) { // ペットのアミュレット
					if (pc.getInventory().checkItem(41160)) { // 召喚の笛
						if (withdrawPet(pc, itemObjid)) {
							pc.getInventory().consumeItem(41160, 1);
						}
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
					}
				} else if (itemId == 40315) { // ペットの笛
					pc.sendPackets(new S_Sound(437));
					pc.broadcastPacket(new S_Sound(437));
					Object[] petList = pc.getPetList().values().toArray();
					for (Object petObject : petList) {
						if (petObject instanceof L1PetInstance) { // ペット
							L1PetInstance pet = (L1PetInstance) petObject;
							pet.call();
						}
					}
				} else if (itemId == 40493) { // マジックフルート
					pc.sendPackets(new S_Sound(165));
					pc.broadcastPacket(new S_Sound(165));
					for (L1Object visible : pc.getKnownObjects()) {
						if (visible instanceof L1GuardianInstance) {
							L1GuardianInstance guardian = (L1GuardianInstance) visible;
							if (guardian.getNpcTemplate().get_npcId() == 70850) { // パン
								L1ItemUtil.createNewItem(pc, 88, 1);
								pc.getInventory().removeItem(l1iteminstance, 1);
							}
						}
					}
				} else if (itemId == 40325) { // 2面コイン
					if (pc.getInventory().checkItem(40318, 1)) {
						int gfxid = 3237 + _random.nextInt(2);
						pc.sendPackets(new S_SkillSound(pc.getId(), gfxid));
						pc.broadcastPacket(new S_SkillSound(pc.getId(), gfxid));
						pc.getInventory().consumeItem(40318, 1);
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
					}
				} else if (itemId == 40326) { // 3方向ルーレット
					if (pc.getInventory().checkItem(40318, 1)) {
						int gfxid = 3229 + _random.nextInt(3);
						pc.sendPackets(new S_SkillSound(pc.getId(), gfxid));
						pc.broadcastPacket(new S_SkillSound(pc.getId(), gfxid));
						pc.getInventory().consumeItem(40318, 1);
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
					}
				} else if (itemId == 40327) { // 4方向ルーレット
					if (pc.getInventory().checkItem(40318, 1)) {
						int gfxid = 3241 + _random.nextInt(4);
						pc.sendPackets(new S_SkillSound(pc.getId(), gfxid));
						pc.broadcastPacket(new S_SkillSound(pc.getId(), gfxid));
						pc.getInventory().consumeItem(40318, 1);
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
					}
				} else if (itemId == 40328) { // 6面ダイス
					if (pc.getInventory().checkItem(40318, 1)) {
						int gfxid = 3204 + _random.nextInt(6);
						pc.sendPackets(new S_SkillSound(pc.getId(), gfxid));
						pc.broadcastPacket(new S_SkillSound(pc.getId(), gfxid));
						pc.getInventory().consumeItem(40318, 1);
					} else {
						// \f1何も起きませんでした。
						pc.sendPackets(new S_ServerMessage(79));
					}
				} else if (itemId == 40089 || itemId == 140089) { // 復活スクロール、
					// 祝福された復活スクロール
					L1Character resobject = (L1Character) L1World.getInstance()
							.findObject(resid);
					if (resobject != null) {
						if (resobject instanceof L1PcInstance) {
							L1PcInstance target = (L1PcInstance) resobject;
							if (pc.getId() == target.getId()) {
								return;
							}
							if (L1World.getInstance().getVisiblePlayer(target,
									0).size() > 0) {
								for (L1PcInstance visiblePc : L1World
										.getInstance().getVisiblePlayer(target,
												0)) {
									if (!visiblePc.isDead()) {
										// \f1その場所に他の人が立っているので復活させることができません。
										pc
												.sendPackets(new S_ServerMessage(
														592));
										return;
									}
								}
							}
							if (target.getCurrentHp() == 0
									&& target.isDead() == true) {
								if (pc.getMap().isUseResurrection()) {
									target.setTempID(pc.getId());
									if (itemId == 40089) {
										// また復活したいですか？（Y/N）
										target.sendPackets(new S_Message_YN(
												321, ""));
									} else if (itemId == 140089) {
										// また復活したいですか？（Y/N）
										target.sendPackets(new S_Message_YN(
												322, ""));
									}
								} else {
									return;
								}
							}
						} else if (resobject instanceof L1NpcInstance) {
							if (!(resobject instanceof L1TowerInstance)) {
								L1NpcInstance npc = (L1NpcInstance) resobject;
								if (npc.getNpcTemplate().isCantResurrect()
										&& !(npc instanceof L1PetInstance)) {
									pc.getInventory().removeItem(
											l1iteminstance, 1);
									return;
								}
								if (npc instanceof L1PetInstance
										&& L1World.getInstance()
												.getVisiblePlayer(npc, 0)
												.size() > 0) {
									for (L1PcInstance visiblePc : L1World
											.getInstance().getVisiblePlayer(
													npc, 0)) {
										if (!visiblePc.isDead()) {
											// \f1その場所に他の人が立っているので復活させることができません。
											pc.sendPackets(new S_ServerMessage(
													592));
											return;
										}
									}
								}
								if (npc.getCurrentHp() == 0 && npc.isDead()) {
									npc.resurrect(npc.getMaxHp() / 4);
									npc.setResurrect(true);
									if ((npc instanceof L1PetInstance)) {
										L1PetInstance pet = (L1PetInstance) npc;
										// 空腹度タイマー開始
										pet.startFoodTimer(pet);
									}
								}
							}
						}
					}
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId > 40169 && itemId < 40226 || itemId >= 45000
						&& itemId <= 45022) { // 魔法書
					L1SpellBook.useSpellBook(pc, l1iteminstance);
				} else if (itemId > 40225 && itemId < 40232) {
					if (pc.isCrown() || pc.isGm()) {
						if (itemId == 40226 && pc.getLevel() >= 15) {
							L1SpellBook.SpellBook4(pc, l1iteminstance, client);
						} else if (itemId == 40228 && pc.getLevel() >= 30) {
							L1SpellBook.SpellBook4(pc, l1iteminstance, client);
						} else if (itemId == 40227 && pc.getLevel() >= 40) {
							L1SpellBook.SpellBook4(pc, l1iteminstance, client);
						} else if ((itemId == 40231 || itemId == 40232)
								&& pc.getLevel() >= 45) {
							L1SpellBook.SpellBook4(pc, l1iteminstance, client);
						} else if (itemId == 40230 && pc.getLevel() >= 50) {
							L1SpellBook.SpellBook4(pc, l1iteminstance, client);
						} else if (itemId == 40229 && pc.getLevel() >= 55) {
							L1SpellBook.SpellBook4(pc, l1iteminstance, client);
						} else {
							pc.sendPackets(new S_ServerMessage(312)); // LVが低くて
						}
					} else {
						pc.sendPackets(new S_ServerMessage(79));
					}
				} else if (itemId >= 40232 && itemId <= 40264 // 精霊の水晶
						|| itemId >= 41149 && itemId <= 41153) {
					L1SpellBook.useElfSpellBook(pc, l1iteminstance, itemId);
				} else if (itemId > 40264 && itemId < 40280) { // 闇精霊の水晶
					if (pc.isDarkelf() || pc.isGm()) {
						if (itemId >= 40265 && itemId <= 40269
								&& pc.getLevel() >= 15) {
							L1SpellBook.SpellBook1(pc, l1iteminstance, client);
						} else if (itemId >= 40270 && itemId <= 40274
								&& pc.getLevel() >= 30) {
							L1SpellBook.SpellBook1(pc, l1iteminstance, client);
						} else if (itemId >= 40275 && itemId <= 40279
								&& pc.getLevel() >= 45) {
							L1SpellBook.SpellBook1(pc, l1iteminstance, client);
						} else {
							pc.sendPackets(new S_ServerMessage(312));
						}
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // (原文:闇精霊の水晶はダークエルフのみが習得できます。)
					}
				} else if (itemId >= 40164 && itemId <= 40166 // 技術書
						|| itemId >= 41147 && itemId <= 41148) {
					if (pc.isKnight() || pc.isGm()) {
						if (itemId >= 40164 && itemId <= 40165 // スタン、リダクションアーマー
								&& pc.getLevel() >= 50) {
							L1SpellBook.SpellBook3(pc, l1iteminstance, client);
						} else if (itemId >= 41147 && itemId <= 41148 // ソリッドキャリッジ、
								// カウンターバリア
								&& pc.getLevel() >= 50) {
							L1SpellBook.SpellBook3(pc, l1iteminstance, client);
						} else if (itemId == 40166 && pc.getLevel() >= 60) { // バウンスアタック
							L1SpellBook.SpellBook3(pc, l1iteminstance, client);
						} else {
							pc.sendPackets(new S_ServerMessage(312));
						}
					} else {
						pc.sendPackets(new S_ServerMessage(79));
					}
				} else if (itemId >= 49102 && itemId <= 49116) { // ドラゴンナイトの書板
					if (pc.isDragonKnight() || pc.isGm()) {
						if (itemId >= 49102 && itemId <= 49106 // ドラゴンナイト秘技LV1
								&& pc.getLevel() >= 15) {
							L1SpellBook.SpellBook5(pc, l1iteminstance, client);
						} else if (itemId >= 49107 && itemId <= 49111 // ドラゴンナイト秘技LV2
								&& pc.getLevel() >= 30) {
							L1SpellBook.SpellBook5(pc, l1iteminstance, client);
						} else if (itemId >= 49112 && itemId <= 49116 // ドラゴンナイト秘技LV3
								&& pc.getLevel() >= 45) {
							L1SpellBook.SpellBook5(pc, l1iteminstance, client);
						} else {
							pc.sendPackets(new S_ServerMessage(312));
						}
					} else {
						pc.sendPackets(new S_ServerMessage(79));
					}
				} else if (itemId >= 49117 && itemId <= 49136) { // 記憶の水晶
					if (pc.isIllusionist() || pc.isGm()) {
						if (itemId >= 49117 && itemId <= 49121 // イリュージョニスト魔法LV1
								&& pc.getLevel() >= 10) {
							L1SpellBook.SpellBook6(pc, l1iteminstance, client);
						} else if (itemId >= 49122 && itemId <= 49126 // イリュージョニスト魔法LV2
								&& pc.getLevel() >= 20) {
							L1SpellBook.SpellBook6(pc, l1iteminstance, client);
						} else if (itemId >= 49127 && itemId <= 49131 // イリュージョニスト魔法LV3
								&& pc.getLevel() >= 30) {
							L1SpellBook.SpellBook6(pc, l1iteminstance, client);
						} else if (itemId >= 49132 && itemId <= 49136 // イリュージョニスト魔法LV4
								&& pc.getLevel() >= 40) {
							L1SpellBook.SpellBook6(pc, l1iteminstance, client);
						} else {
							pc.sendPackets(new S_ServerMessage(312));
						}
					} else {
						pc.sendPackets(new S_ServerMessage(79));
					}
				} else if (itemId == 40079 || itemId == 40095) { // 帰還スクロール
					if (pc.getMap().isEscapable() || pc.isGm()) {
						int[] loc = Getback.GetBack_Location(pc, true);
						L1Teleport.teleport(pc, loc[0], loc[1], (short) loc[2],
								5, true);
						pc.getInventory().removeItem(l1iteminstance, 1);
					} else {
						pc.sendPackets(new S_ServerMessage(647));
						// pc.sendPackets(new
						// S_CharVisualUpdate(pc));
					}
					cancelAbsoluteBarrier(pc); // アブソルート バリアの解除
				} else if (itemId == 40124) { // 血盟帰還スクロール
					if (pc.getMap().isEscapable() || pc.isGm()) {
						int castle_id = 0;
						int house_id = 0;
						if (pc.getClanid() != 0) { // クラン所属
							L1Clan clan = L1World.getInstance().getClan(
									pc.getClanname());
							if (clan != null) {
								castle_id = clan.getCastleId();
								house_id = clan.getHouseId();
							}
						}
						if (castle_id != 0) { // 城主クラン員
							if (pc.getMap().isEscapable() || pc.isGm()) {
								int[] loc = new int[3];
								loc = L1CastleLocation.getCastleLoc(castle_id);
								int locx = loc[0];
								int locy = loc[1];
								short mapid = (short) (loc[2]);
								L1Teleport.teleport(pc, locx, locy, mapid, 5,
										true);
								pc.getInventory().removeItem(l1iteminstance, 1);
							} else {
								pc.sendPackets(new S_ServerMessage(647));
							}
						} else if (house_id != 0) { // アジト所有クラン員
							if (pc.getMap().isEscapable() || pc.isGm()) {
								int[] loc = new int[3];
								loc = L1HouseLocation.getHouseLoc(house_id);
								int locx = loc[0];
								int locy = loc[1];
								short mapid = (short) (loc[2]);
								L1Teleport.teleport(pc, locx, locy, mapid, 5,
										true);
								pc.getInventory().removeItem(l1iteminstance, 1);
							} else {
								pc.sendPackets(new S_ServerMessage(647));
							}
						} else {
							if (pc.getHomeTownId() > 0) {
								int[] loc = L1TownLocation.getGetBackLoc(pc
										.getHomeTownId());
								int locx = loc[0];
								int locy = loc[1];
								short mapid = (short) (loc[2]);
								L1Teleport.teleport(pc, locx, locy, mapid, 5,
										true);
								pc.getInventory().removeItem(l1iteminstance, 1);
							} else {
								int[] loc = Getback.GetBack_Location(pc, true);
								L1Teleport.teleport(pc, loc[0], loc[1],
										(short) loc[2], 5, true);
								pc.getInventory().removeItem(l1iteminstance, 1);
							}
						}
					} else {
						pc.sendPackets(new S_ServerMessage(647));
					}
					cancelAbsoluteBarrier(pc); // アブソルート バリアの解除
				} else if (itemId == 140100 || itemId == 40100
						|| itemId == 40099 // 祝福されたテレポートスクロール、テレポートスクロール
						|| itemId == 40086 || itemId == 40863) { // スペルスクロール(テレポート
					// )
					L1BookMark bookm = pc.getBookMark(btele);
					if (bookm != null) { // ブックマークを取得出来たらテレポート
						if (pc.getMap().isEscapable() || pc.isGm()) {
							int newX = bookm.getLocX();
							int newY = bookm.getLocY();
							short mapId = bookm.getMapId();

							if (itemId == 40086) { // マステレポートスクロール
								for (L1PcInstance member : L1World
										.getInstance().getVisiblePlayer(pc)) {
									if (pc.getLocation().getTileLineDistance(
											member.getLocation()) <= 3
											&& member.getClanid() == pc
													.getClanid()
											&& pc.getClanid() != 0
											&& member.getId() != pc.getId()) {
										L1Teleport.teleport(member, newX, newY,
												mapId, 5, true);
									}
								}
							}
							L1Teleport.teleport(pc, newX, newY, mapId, 5, true);
							pc.getInventory().removeItem(l1iteminstance, 1);
						} else {
							L1Teleport.teleport(pc, pc.getX(), pc.getY(), pc
									.getMapId(), pc.getHeading(), false);
							pc.sendPackets(new S_ServerMessage(79));
						}
					} else {
						if (pc.getMap().isTeleportable() || pc.isGm()) {
							L1Location newLocation = pc.getLocation()
									.randomLocation(200, true);
							int newX = newLocation.getX();
							int newY = newLocation.getY();
							short mapId = (short) newLocation.getMapId();

							if (itemId == 40086) { // マステレポートスクロール
								for (L1PcInstance member : L1World
										.getInstance().getVisiblePlayer(pc)) {
									if (pc.getLocation().getTileLineDistance(
											member.getLocation()) <= 3
											&& member.getClanid() == pc
													.getClanid()
											&& pc.getClanid() != 0
											&& member.getId() != pc.getId()) {
										L1Teleport.teleport(member, newX, newY,
												mapId, 5, true);
									}
								}
							}
							L1Teleport.teleport(pc, newX, newY, mapId, 5, true);
							pc.getInventory().removeItem(l1iteminstance, 1);
						} else {
							L1Teleport.teleport(pc, pc.getX(), pc.getY(), pc
									.getMapId(), pc.getHeading(), false);
							pc.sendPackets(new S_ServerMessage(276));
						}
					}
					cancelAbsoluteBarrier(pc); // アブソルート バリアの解除
				} else if (itemId == 240100) { // 呪われたテレポートスクロール(オリジナルアイテム)
					L1Teleport.teleport(pc, pc.getX(), pc.getY(),
							pc.getMapId(), pc.getHeading(), true);
					pc.getInventory().removeItem(l1iteminstance, 1);
					cancelAbsoluteBarrier(pc); // アブソルート バリアの解除
				} else if (itemId >= 40901 && itemId <= 40908) { // 各種エンゲージリング
					L1PcInstance partner = null;
					boolean partner_stat = false;
					if (pc.getPartnerId() != 0) { // 結婚中
						partner = (L1PcInstance) L1World.getInstance()
								.findObject(pc.getPartnerId());
						if (partner != null && partner.getPartnerId() != 0
								&& pc.getPartnerId() == partner.getId()
								&& partner.getPartnerId() == pc.getId()) {
							partner_stat = true;
						}
					} else {
						pc.sendPackets(new S_ServerMessage(662)); // \f1あなたは結婚していません。
						return;
					}

					if (partner_stat) {
						boolean castle_area = L1CastleLocation
								.checkInAllWarArea(
								// いずれかの城エリア
										partner.getX(), partner.getY(), partner
												.getMapId());
						if ((partner.getMapId() == 0 || partner.getMapId() == 4 || partner
								.getMapId() == 304)
								&& castle_area == false) {
							L1Teleport.teleport(pc, partner.getX(), partner
									.getY(), partner.getMapId(), 5, true);
						} else {
							pc.sendPackets(new S_ServerMessage(547)); // \f1あなたのパートナーは今あなたが行けない所でプレイ中です。
						}
					} else {
						pc.sendPackets(new S_ServerMessage(546)); // \f1あなたのパートナーは今プレイをしていません。
					}
				} else if (itemId == 40555) { // 秘密の部屋のキー
					if (pc.isKnight()
							&& (pc.getX() >= 32806 && // オリム部屋
							pc.getX() <= 32814)
							&& (pc.getY() >= 32798 && pc.getY() <= 32807)
							&& pc.getMapId() == 13) {
						short mapid = 13;
						L1Teleport.teleport(pc, 32815, 32810, mapid, 5, false);
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
					}
				} else if (itemId == 40417) { // ソウルクリスタル
					if ((pc.getX() >= 32665 && // 海賊島
					pc.getX() <= 32674)
							&& (pc.getY() >= 32976 && pc.getY() <= 32985)
							&& pc.getMapId() == 440) {
						short mapid = 430;
						L1Teleport.teleport(pc, 32922, 32812, mapid, 5, true);
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした
						// 。
					}
				} else if (itemId == 40566) { // ミステリアス シェル
					if (pc.isElf()
							&& (pc.getX() >= 33971 && // 象牙の塔の村の南にある魔方陣の座標
							pc.getX() <= 33975)
							&& (pc.getY() >= 32324 && pc.getY() <= 32328)
							&& pc.getMapId() == 4
							&& !pc.getInventory().checkItem(40548)) { // 亡霊の袋
						boolean found = false;
						for (L1Object obj : L1World.getInstance().getObject()) {
							if (obj instanceof L1MonsterInstance) {
								L1MonsterInstance mob = (L1MonsterInstance) obj;
								if (mob != null) {
									if (mob.getNpcTemplate().get_npcId() == 45300) {
										found = true;
										break;
									}
								}
							}
						}
						if (found) {
							pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
						} else {
							L1SpawnUtil.spawn(pc, 45300, 0, 0); // 古代人の亡霊
						}
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
					}
				} else if (itemId == 40557) { // 暗殺リスト(グルーディン)
					if (pc.getX() == 32620 && pc.getY() == 32641
							&& pc.getMapId() == 4) {
						for (L1Object object : L1World.getInstance()
								.getObject()) {
							if (object instanceof L1NpcInstance) {
								L1NpcInstance npc = (L1NpcInstance) object;
								if (npc.getNpcTemplate().get_npcId() == 45883) {
									pc.sendPackets(new S_ServerMessage(79));
									return;
								}
							}
						}
						L1SpawnUtil.spawn(pc, 45883, 0, 300000);
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
					}
				} else if (itemId == 40563) { // 暗殺リスト(火田村)
					if (pc.getX() == 32730 && pc.getY() == 32426
							&& pc.getMapId() == 4) {
						for (L1Object object : L1World.getInstance()
								.getObject()) {
							if (object instanceof L1NpcInstance) {
								L1NpcInstance npc = (L1NpcInstance) object;
								if (npc.getNpcTemplate().get_npcId() == 45884) {
									pc.sendPackets(new S_ServerMessage(79));
									return;
								}
							}
						}
						L1SpawnUtil.spawn(pc, 45884, 0, 300000);
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
					}
				} else if (itemId == 40561) { // 暗殺リスト(ケント)
					if (pc.getX() == 33046 && pc.getY() == 32806
							&& pc.getMapId() == 4) {
						for (L1Object object : L1World.getInstance()
								.getObject()) {
							if (object instanceof L1NpcInstance) {
								L1NpcInstance npc = (L1NpcInstance) object;
								if (npc.getNpcTemplate().get_npcId() == 45885) {
									pc.sendPackets(new S_ServerMessage(79));
									return;
								}
							}
						}
						L1SpawnUtil.spawn(pc, 45885, 0, 300000);
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
					}
				} else if (itemId == 40560) { // 暗殺リスト(ウッドベック)
					if (pc.getX() == 32580 && pc.getY() == 33260
							&& pc.getMapId() == 4) {
						for (L1Object object : L1World.getInstance()
								.getObject()) {
							if (object instanceof L1NpcInstance) {
								L1NpcInstance npc = (L1NpcInstance) object;
								if (npc.getNpcTemplate().get_npcId() == 45886) {
									pc.sendPackets(new S_ServerMessage(79));
									return;
								}
							}
						}
						L1SpawnUtil.spawn(pc, 45886, 0, 300000);
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
					}
				} else if (itemId == 40562) { // 暗殺リスト(ハイネ)
					if (pc.getX() == 33447 && pc.getY() == 33476
							&& pc.getMapId() == 4) {
						for (L1Object object : L1World.getInstance()
								.getObject()) {
							if (object instanceof L1NpcInstance) {
								L1NpcInstance npc = (L1NpcInstance) object;
								if (npc.getNpcTemplate().get_npcId() == 45887) {
									pc.sendPackets(new S_ServerMessage(79));
									return;
								}
							}
						}
						L1SpawnUtil.spawn(pc, 45887, 0, 300000);
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
					}
				} else if (itemId == 40559) { // 暗殺リスト(アデン)
					if (pc.getX() == 34215 && pc.getY() == 33195
							&& pc.getMapId() == 4) {
						for (L1Object object : L1World.getInstance()
								.getObject()) {
							if (object instanceof L1NpcInstance) {
								L1NpcInstance npc = (L1NpcInstance) object;
								if (npc.getNpcTemplate().get_npcId() == 45888) {
									pc.sendPackets(new S_ServerMessage(79));
									return;
								}
							}
						}
						L1SpawnUtil.spawn(pc, 45888, 0, 300000);
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
					}
				} else if (itemId == 40558) { // 暗殺リスト(ギラン)
					if (pc.getX() == 33513 && pc.getY() == 32890
							&& pc.getMapId() == 4) {
						for (L1Object object : L1World.getInstance()
								.getObject()) {
							if (object instanceof L1NpcInstance) {
								L1NpcInstance npc = (L1NpcInstance) object;
								if (npc.getNpcTemplate().get_npcId() == 45889) {
									pc.sendPackets(new S_ServerMessage(79));
									return;
								}
							}
						}
						L1SpawnUtil.spawn(pc, 45889, 0, 300000);
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
					}
				} else if (itemId == 40572) { // アサシンの印
					if (pc.getX() == 32778 && pc.getY() == 32738
							&& pc.getMapId() == 21) {
						L1Teleport.teleport(pc, 32781, 32728, (short) 21, 5,
								true);
					} else if (pc.getX() == 32781 && pc.getY() == 32728
							&& pc.getMapId() == 21) {
						L1Teleport.teleport(pc, 32778, 32738, (short) 21, 5,
								true);
					} else {
						pc.sendPackets(new S_ServerMessage(79));
					}
				} else if (itemId == 40006 || itemId == 40412
						|| itemId == 140006) { // パインワンド
					if (pc.getMap().isUsePainwand()) {
						S_AttackPacket s_attackPacket = new S_AttackPacket(pc,
								0, ActionCodes.ACTION_Wand);
						pc.sendPackets(s_attackPacket);
						pc.broadcastPacket(s_attackPacket);
						int chargeCount = l1iteminstance.getChargeCount();
						if (chargeCount <= 0 && itemId != 40412) {
							// \f1何も起きませんでした。
							pc.sendPackets(new S_ServerMessage(79));
							return;
						}
						int[] mobArray = { 45008, 45140, 45016, 45021, 45025,
								45033, 45099, 45147, 45123, 45130, 45046,
								45092, 45138, 45098, 45127, 45143, 45149,
								45171, 45040, 45155, 45192, 45173, 45213,
								45079, 45144 };
						// ゴブリン・ホブコブリン・コボルト・鹿・グレムリン
						// インプ・インプエルダー・オウルベア・スケルトンアーチャー・スケルトンアックス
						// ビーグル・ドワーフウォーリアー・オークスカウト・ガンジオーク・ロバオーク
						// ドゥダーマラオーク・アトゥバオーク・ネルガオーク・ベアー・トロッグ
						// ラットマン・ライカンスロープ・ガースト・ノール・リザードマン
						/*
						 * 45005, 45008, 45009, 45016, 45019, 45043, 45060,
						 * 45066, 45068, 45082, 45093, 45101, 45107, 45126,
						 * 45129, 45136, 45144, 45157, 45161, 45173, 45184,
						 * 45223 }; // カエル、ゴブリン、オーク、コボルド、 // オーク
						 * アーチャー、ウルフ、スライム、ゾンビ、 // フローティングアイ、オーク ファイター、 // ウェア
						 * ウルフ、アリゲーター、スケルトン、 // ストーン ゴーレム、スケルトン アーチャー、 // ジャイアント
						 * スパイダー、リザードマン、グール、 // スパルトイ、ライカンスロープ、ドレッド スパイダー、 //
						 * バグベアー
						 */
						int rnd = _random.nextInt(mobArray.length);
						L1SpawnUtil.spawn(pc, mobArray[rnd], 0, 300000);
						if (itemId == 40006 || itemId == 140006) {
							if (l1iteminstance.getChargeCount() > 1) {
								l1iteminstance.setChargeCount(l1iteminstance
										.getChargeCount() - 1);
								pc.getInventory().updateItem(l1iteminstance,
										L1PcInventory.COL_CHARGE_COUNT);
							} else {
								pc.getInventory().deleteItem(l1iteminstance);
							}
							if (l1iteminstance.getChargeCount() == 0) { // チャージ数0で自動削除
								pc.getInventory().removeItem(l1iteminstance, 1);
							} else {
							}
						} else {
							pc.getInventory().removeItem(l1iteminstance, 1);
						}
					} else {
						// \f1何も起きませんでした。
						pc.sendPackets(new S_ServerMessage(79));
					}
				} else if (itemId == 40007) { // エボニー ワンド
					cancelAbsoluteBarrier(pc); // アブソルート バリアの解除
					int chargeCount = l1iteminstance.getChargeCount();
					if (chargeCount <= 0) {
						// \f1何も起きませんでした。
						pc.sendPackets(new S_ServerMessage(79));
						return;
					}
					L1Object target = L1World.getInstance().findObject(
							spellsc_objid);
					pc.sendPackets(new S_UseAttackSkill(pc, spellsc_objid, 10,
							spellsc_x, spellsc_y, ActionCodes.ACTION_Wand));
					pc.broadcastPacket(new S_UseAttackSkill(pc, spellsc_objid,
							10, spellsc_x, spellsc_y, ActionCodes.ACTION_Wand));
					if (target != null) {
						doWandAction(pc, target);
					}
					if (l1iteminstance.getChargeCount() > 1) {
						l1iteminstance.setChargeCount(l1iteminstance
								.getChargeCount() - 1);
						pc.getInventory().updateItem(l1iteminstance,
								L1PcInventory.COL_CHARGE_COUNT);
					} else {
						pc.getInventory().deleteItem(l1iteminstance);
					}
					if (l1iteminstance.getChargeCount() == 0) { // チャージ数0で自動削除
						pc.getInventory().removeItem(l1iteminstance, 1);
					} else {
					}
				} else if (itemId == 40008 || itemId == 40410
						|| itemId == 140008) { // メイプルワンド
					if (pc.getMapId() == 63 || pc.getMapId() == 552
							|| pc.getMapId() == 555 || pc.getMapId() == 557
							|| pc.getMapId() == 558 || pc.getMapId() == 779) { // 水中では使用不可
						pc.sendPackets(new S_ServerMessage(563)); // \f1ここでは使えません
						// 。
					} else {
						pc.sendPackets(new S_AttackPacket(pc, 0,
								ActionCodes.ACTION_Wand));
						pc.broadcastPacket(new S_AttackPacket(pc, 0,
								ActionCodes.ACTION_Wand));
						int chargeCount = l1iteminstance.getChargeCount();
						if (chargeCount <= 0 && itemId != 40410
								|| pc.getTempCharGfx() == 6034
								|| pc.getTempCharGfx() == 6035) {
							// \f1何も起きませんでした。
							pc.sendPackets(new S_ServerMessage(79));
							return;
						}
						L1Object target = L1World.getInstance().findObject(
								spellsc_objid);
						if (target != null) {
							L1Character cha = (L1Character) target;
							polyAction(pc, cha);
							cancelAbsoluteBarrier(pc); // アブソルート バリアの解除
							if (itemId == 40008 || itemId == 140008) {
								if (l1iteminstance.getChargeCount() > 1) {
									l1iteminstance
											.setChargeCount(l1iteminstance
													.getChargeCount() - 1);
									pc.getInventory().updateItem(
											l1iteminstance,
											L1PcInventory.COL_CHARGE_COUNT);
								} else {
									pc.getInventory()
											.deleteItem(l1iteminstance);
								}
								if (l1iteminstance.getChargeCount() == 0) { // チャージ数0で自動削除
									pc.getInventory().removeItem(
											l1iteminstance, 1);
								} else {
								}
							} else {
								pc.getInventory().removeItem(l1iteminstance, 1);
							}
						} else {
							pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
						}
					}
					// if (pc.getId() == target.getId()) { // ターゲットが自分
					// ;
					// } else if (target instanceof L1PcInstance) { // ターゲットがPC
					// L1PcInstance targetpc = (L1PcInstance) target;
					// if (pc.getClanid() != 0
					// && pc.getClanid() == targetpc.getClanid()) { //
					// ターゲットが同じクラン
					// ;
					// }
					// } else { // その他（NPCや他のクランのPC）
					// }
				} else if (itemId >= 40289 && itemId <= 40297) { // 傲慢の塔11~91階テレポートアミュレット
					useToiTeleportAmulet(pc, itemId, l1iteminstance);
				} else if (itemId >= 40280 && itemId <= 40288) {
					// 封印された傲慢の塔11～91階テレポートアミュレット
					pc.getInventory().removeItem(l1iteminstance, 1);
					L1ItemInstance item = pc.getInventory().storeItem(
							itemId + 9, 1);
					if (item != null) {
						pc.sendPackets(new S_ServerMessage(403, item
								.getLogName()));
					}
					// 肉類
				} else if (itemId == 40056 || itemId == 40057
						|| itemId == 40059 || itemId == 40060
						|| itemId == 40061 || itemId == 40062
						|| itemId == 40063 || itemId == 40064
						|| itemId == 40065 || itemId == 40069
						|| itemId == 40072 || itemId == 40073
						|| itemId == 140061 || itemId == 140062
						|| itemId == 140065 || itemId == 140069
						|| itemId == 140072 || itemId == 41296
						|| itemId == 41297 || itemId == 41266
						|| itemId == 41267 || itemId == 41274
						|| itemId == 41275 || itemId == 41276
						|| itemId == 41252 || itemId == 49040
						|| itemId == 49041 || itemId == 49042
						|| itemId == 49043 || itemId == 49044
						|| itemId == 49045 || itemId == 49046
						|| itemId == 49047) {
					pc.getInventory().removeItem(l1iteminstance, 1);
					// XXX 食べ物毎の満腹度(100単位で変動)
					short foodvolume1 = (short) (l1iteminstance.getItem()
							.getFoodVolume() / 10);
					short foodvolume2 = 0;
					if (foodvolume1 <= 0) {
						foodvolume1 = 5;
					}
					if (pc.getFood() >= 225) {
						pc.sendPackets(new S_PacketBox(S_PacketBox.FOOD,
								(short) pc.getFood()));
					} else {
						foodvolume2 = (short) (pc.getFood() + foodvolume1);
						if (foodvolume2 <= 225) {
							pc.setFood(foodvolume2);
							pc.sendPackets(new S_PacketBox(S_PacketBox.FOOD,
									(short) pc.getFood()));
						} else {
							pc.setFood((short) 225);
							pc.sendPackets(new S_PacketBox(S_PacketBox.FOOD,
									(short) pc.getFood()));
						}
					}
					if (itemId == 40057) { // フローティングアイ肉
						pc.setSkillEffect(STATUS_FLOATING_EYE, 0);
					}
					pc.sendPackets(new S_ServerMessage(76, l1iteminstance
							.getItem().getIdentifiedNameId()));
				} else if (itemId == 40070) { // 進化の実
					pc.sendPackets(new S_ServerMessage(76, l1iteminstance
							.getLogName()));
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 41298) { // ヤングフィッシュ
					UseHeallingPotion(pc, 4, 189);
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 41299) { // スウィフトフィッシュ
					UseHeallingPotion(pc, 15, 194);
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 41300) { // ストロングフィッシュ
					UseHeallingPotion(pc, 35, 197);
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 41301) { // シャイニングレッドフィッシュ
					int chance = _random.nextInt(10);
					if (chance >= 0 && chance < 5) {
						UseHeallingPotion(pc, 15, 189);
					} else if (chance >= 5 && chance < 9) {
						L1ItemUtil.createNewItem(pc, 40019, 1);
					} else if (chance >= 9) {
						int gemChance = _random.nextInt(3);
						if (gemChance == 0) {
							L1ItemUtil.createNewItem(pc, 40045, 1);
						} else if (gemChance == 1) {
							L1ItemUtil.createNewItem(pc, 40049, 1);
						} else if (gemChance == 2) {
							L1ItemUtil.createNewItem(pc, 40053, 1);
						}
					}
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 41302) { // シャイニンググリーンフィッシュ
					int chance = _random.nextInt(3);
					if (chance >= 0 && chance < 5) {
						UseHeallingPotion(pc, 15, 189);
					} else if (chance >= 5 && chance < 9) {
						L1ItemUtil.createNewItem(pc, 40018, 1);
					} else if (chance >= 9) {
						int gemChance = _random.nextInt(3);
						if (gemChance == 0) {
							L1ItemUtil.createNewItem(pc, 40047, 1);
						} else if (gemChance == 1) {
							L1ItemUtil.createNewItem(pc, 40051, 1);
						} else if (gemChance == 2) {
							L1ItemUtil.createNewItem(pc, 40055, 1);
						}
					}
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 41303) { // シャイニングブルーフィッシュ
					int chance = _random.nextInt(3);
					if (chance >= 0 && chance < 5) {
						UseHeallingPotion(pc, 15, 189);
					} else if (chance >= 5 && chance < 9) {
						L1ItemUtil.createNewItem(pc, 40015, 1);
					} else if (chance >= 9) {
						int gemChance = _random.nextInt(3);
						if (gemChance == 0) {
							L1ItemUtil.createNewItem(pc, 40046, 1);
						} else if (gemChance == 1) {
							L1ItemUtil.createNewItem(pc, 40050, 1);
						} else if (gemChance == 2) {
							L1ItemUtil.createNewItem(pc, 40054, 1);
						}
					}
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 41304) { // シャイニングホワイトフィッシュ
					int chance = _random.nextInt(3);
					if (chance >= 0 && chance < 5) {
						UseHeallingPotion(pc, 15, 189);
					} else if (chance >= 5 && chance < 9) {
						L1ItemUtil.createNewItem(pc, 40021, 1);
					} else if (chance >= 9) {
						int gemChance = _random.nextInt(3);
						if (gemChance == 0) {
							L1ItemUtil.createNewItem(pc, 40044, 1);
						} else if (gemChance == 1) {
							L1ItemUtil.createNewItem(pc, 40048, 1);
						} else if (gemChance == 2) {
							L1ItemUtil.createNewItem(pc, 40052, 1);
						}
					}
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId >= 40136 && itemId <= 40161) { // 花火
					int soundid = 3198;
					if (itemId == 40154) {
						soundid = 3198;
					} else if (itemId == 40152) {
						soundid = 2031;
					} else if (itemId == 40141) {
						soundid = 2028;
					} else if (itemId == 40160) {
						soundid = 2030;
					} else if (itemId == 40145) {
						soundid = 2029;
					} else if (itemId == 40159) {
						soundid = 2033;
					} else if (itemId == 40151) {
						soundid = 2032;
					} else if (itemId == 40161) {
						soundid = 2037;
					} else if (itemId == 40142) {
						soundid = 2036;
					} else if (itemId == 40146) {
						soundid = 2039;
					} else if (itemId == 40148) {
						soundid = 2043;
					} else if (itemId == 40143) {
						soundid = 2041;
					} else if (itemId == 40156) {
						soundid = 2042;
					} else if (itemId == 40139) {
						soundid = 2040;
					} else if (itemId == 40137) {
						soundid = 2047;
					} else if (itemId == 40136) {
						soundid = 2046;
					} else if (itemId == 40138) {
						soundid = 2048;
					} else if (itemId == 40140) {
						soundid = 2051;
					} else if (itemId == 40144) {
						soundid = 2053;
					} else if (itemId == 40147) {
						soundid = 2045;
					} else if (itemId == 40149) {
						soundid = 2034;
					} else if (itemId == 40150) {
						soundid = 2055;
					} else if (itemId == 40153) {
						soundid = 2038;
					} else if (itemId == 40155) {
						soundid = 2044;
					} else if (itemId == 40157) {
						soundid = 2035;
					} else if (itemId == 40158) {
						soundid = 2049;
					} else {
						soundid = 3198;
					}

					S_SkillSound s_skillsound = new S_SkillSound(pc.getId(),
							soundid);
					pc.sendPackets(s_skillsound);
					pc.broadcastPacket(s_skillsound);
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId >= 41357 && itemId <= 41382) { // アルファベット花火
					int soundid = itemId - 34946;
					S_SkillSound s_skillsound = new S_SkillSound(pc.getId(),
							soundid);
					pc.sendPackets(s_skillsound);
					pc.broadcastPacket(s_skillsound);
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 40615) { // 影の神殿2階の鍵
					if ((pc.getX() >= 32701 && pc.getX() <= 32705)
							&& (pc.getY() >= 32894 && pc.getY() <= 32898)
							&& pc.getMapId() == 522) { // 影の神殿1F
						L1Teleport.teleport(pc, ((L1EtcItem) l1iteminstance
								.getItem()).get_locx(),
								((L1EtcItem) l1iteminstance.getItem())
										.get_locy(),
								((L1EtcItem) l1iteminstance.getItem())
										.get_mapid(), 5, true);
					} else {
						// \f1何も起きませんでした。
						pc.sendPackets(new S_ServerMessage(79));
					}
				} else if (itemId == 40616 || itemId == 40782
						|| itemId == 40783) { // 影の神殿3階の鍵
					if ((pc.getX() >= 32698 && pc.getX() <= 32702)
							&& (pc.getY() >= 32894 && pc.getY() <= 32898)
							&& pc.getMapId() == 523) { // 影の神殿2階
						L1Teleport.teleport(pc, ((L1EtcItem) l1iteminstance
								.getItem()).get_locx(),
								((L1EtcItem) l1iteminstance.getItem())
										.get_locy(),
								((L1EtcItem) l1iteminstance.getItem())
										.get_mapid(), 5, true);
					} else {
						// \f1何も起きませんでした。
						pc.sendPackets(new S_ServerMessage(79));
					}
				} else if (itemId == 40692) { // 完成された宝の地図
					if (pc.getInventory().checkItem(40621)) {
						// \f1何も起きませんでした。
						pc.sendPackets(new S_ServerMessage(79));
					} else if ((pc.getX() >= 32856 && pc.getX() <= 32858)
							&& (pc.getY() >= 32857 && pc.getY() <= 32858)
							&& pc.getMapId() == 443) { // 海賊島のダンジョン３階
						L1Teleport.teleport(pc, ((L1EtcItem) l1iteminstance
								.getItem()).get_locx(),
								((L1EtcItem) l1iteminstance.getItem())
										.get_locy(),
								((L1EtcItem) l1iteminstance.getItem())
										.get_mapid(), 5, true);
					} else {
						// \f1何も起きませんでした。
						pc.sendPackets(new S_ServerMessage(79));
					}
				} else if (itemId == 41146) { // ドロモンドの招待状
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "ei001"));
				} else if (itemId == 40641) { // トーキングスクロール
					if (Config.ALT_TALKINGSCROLLQUEST == true) {
						if (pc.getQuest().get_step(L1Quest.QUEST_TOSCROLL) == 0) {
							pc.sendPackets(new S_NPCTalkReturn(pc.getId(),
									"tscrolla"));
						} else if (pc.getQuest().get_step(
								L1Quest.QUEST_TOSCROLL) == 1) {
							pc.sendPackets(new S_NPCTalkReturn(pc.getId(),
									"tscrollb"));
						} else if (pc.getQuest().get_step(
								L1Quest.QUEST_TOSCROLL) == 2) {
							pc.sendPackets(new S_NPCTalkReturn(pc.getId(),
									"tscrollc"));
						} else if (pc.getQuest().get_step(
								L1Quest.QUEST_TOSCROLL) == 3) {
							pc.sendPackets(new S_NPCTalkReturn(pc.getId(),
									"tscrolld"));
						} else if (pc.getQuest().get_step(
								L1Quest.QUEST_TOSCROLL) == 4) {
							pc.sendPackets(new S_NPCTalkReturn(pc.getId(),
									"tscrolle"));
						} else if (pc.getQuest().get_step(
								L1Quest.QUEST_TOSCROLL) == 5) {
							pc.sendPackets(new S_NPCTalkReturn(pc.getId(),
									"tscrollf"));
						} else if (pc.getQuest().get_step(
								L1Quest.QUEST_TOSCROLL) == 6) {
							pc.sendPackets(new S_NPCTalkReturn(pc.getId(),
									"tscrollg"));
						} else if (pc.getQuest().get_step(
								L1Quest.QUEST_TOSCROLL) == 7) {
							pc.sendPackets(new S_NPCTalkReturn(pc.getId(),
									"tscrollh"));
						} else if (pc.getQuest().get_step(
								L1Quest.QUEST_TOSCROLL) == 8) {
							pc.sendPackets(new S_NPCTalkReturn(pc.getId(),
									"tscrolli"));
						} else if (pc.getQuest().get_step(
								L1Quest.QUEST_TOSCROLL) == 9) {
							pc.sendPackets(new S_NPCTalkReturn(pc.getId(),
									"tscrollj"));
						} else if (pc.getQuest().get_step(
								L1Quest.QUEST_TOSCROLL) == 10) {
							pc.sendPackets(new S_NPCTalkReturn(pc.getId(),
									"tscrollk"));
						} else if (pc.getQuest().get_step(
								L1Quest.QUEST_TOSCROLL) == 11) {
							pc.sendPackets(new S_NPCTalkReturn(pc.getId(),
									"tscrolll"));
						} else if (pc.getQuest().get_step(
								L1Quest.QUEST_TOSCROLL) == 12) {
							pc.sendPackets(new S_NPCTalkReturn(pc.getId(),
									"tscrollm"));
						} else if (pc.getQuest().get_step(
								L1Quest.QUEST_TOSCROLL) == 13) {
							pc.sendPackets(new S_NPCTalkReturn(pc.getId(),
									"tscrolln"));
						} else if (pc.getQuest().get_step(
								L1Quest.QUEST_TOSCROLL) == 255) {
							pc.sendPackets(new S_NPCTalkReturn(pc.getId(),
									"tscrollo"));
						}
					} else {
						pc.sendPackets(new S_NPCTalkReturn(pc.getId(),
								"tscrollp"));
					}
				} else if (itemId == 40383) { // 地図：歌う島
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "ei035"));
				} else if (itemId == 40384) { // 地図：隠された渓谷
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "ei036"));
				} else if (itemId == 40101) { // 隠された渓谷帰還スクロール
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "ei037"));
				} else if (itemId == 41209) { // ポピレアの依頼書
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "ei002"));
				} else if (itemId == 41210) { // 研磨材
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "ei003"));
				} else if (itemId == 41211) { // ハーブ
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "ei004"));
				} else if (itemId == 41212) { // 特製キャンディー
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "ei005"));
				} else if (itemId == 41213) { // ティミーのバスケット
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "ei006"));
				} else if (itemId == 41214) { // 運の証
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "ei012"));
				} else if (itemId == 41215) { // 知の証
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "ei010"));
				} else if (itemId == 41216) { // 力の証
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "ei011"));
				} else if (itemId == 41222) { // マシュル
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "ei008"));
				} else if (itemId == 41223) { // 武具の破片
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "ei007"));
				} else if (itemId == 41224) { // バッジ
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "ei009"));
				} else if (itemId == 41225) { // ケスキンの発注書
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "ei013"));
				} else if (itemId == 41226) { // パゴの薬
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "ei014"));
				} else if (itemId == 41227) { // アレックスの紹介状
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "ei033"));
				} else if (itemId == 41228) { // ラビのお守り
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "ei034"));
				} else if (itemId == 41229) { // スケルトンの頭
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "ei025"));
				} else if (itemId == 41230) { // ジーナンへの手紙
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "ei020"));
				} else if (itemId == 41231) { // マッティへの手紙
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "ei021"));
				} else if (itemId == 41233) { // ケーイへの手紙
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "ei019"));
				} else if (itemId == 41234) { // 骨の入った袋
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "ei023"));
				} else if (itemId == 41235) { // 材料表
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "ei024"));
				} else if (itemId == 41236) { // ボーンアーチャーの骨
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "ei026"));
				} else if (itemId == 41237) { // スケルトンスパイクの骨
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "ei027"));
				} else if (itemId == 41239) { // ヴートへの手紙
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "ei018"));
				} else if (itemId == 41240) { // フェーダへの手紙
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "ei022"));
				} else if (itemId == 41060) { // ノナメの推薦書
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "nonames"));
				} else if (itemId == 41061) { // 調査団の証書：エルフ地域ドゥダ-マラカメ
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "kames"));
				} else if (itemId == 41062) { // 調査団の証書：人間地域ネルガバクモ
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "bakumos"));
				} else if (itemId == 41063) { // 調査団の証書：精霊地域ドゥダ-マラブカ
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "bukas"));
				} else if (itemId == 41064) { // 調査団の証書：オーク地域ネルガフウモ
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "huwoomos"));
				} else if (itemId == 41065) { // 調査団の証書：調査団長アトゥバノア
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "noas"));
				} else if (itemId == 41356) { // パルームの資源リスト
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "rparum3"));
				} else if (itemId == 40701) { // 小さな宝の地図
					if (pc.getQuest().get_step(L1Quest.QUEST_LUKEIN1) == 1) {
						pc.sendPackets(new S_NPCTalkReturn(pc.getId(),
								"firsttmap"));
					} else if (pc.getQuest().get_step(L1Quest.QUEST_LUKEIN1) == 2) {
						pc.sendPackets(new S_NPCTalkReturn(pc.getId(),
								"secondtmapa"));
					} else if (pc.getQuest().get_step(L1Quest.QUEST_LUKEIN1) == 3) {
						pc.sendPackets(new S_NPCTalkReturn(pc.getId(),
								"secondtmapb"));
					} else if (pc.getQuest().get_step(L1Quest.QUEST_LUKEIN1) == 4) {
						pc.sendPackets(new S_NPCTalkReturn(pc.getId(),
								"secondtmapc"));
					} else if (pc.getQuest().get_step(L1Quest.QUEST_LUKEIN1) == 5) {
						pc.sendPackets(new S_NPCTalkReturn(pc.getId(),
								"thirdtmapd"));
					} else if (pc.getQuest().get_step(L1Quest.QUEST_LUKEIN1) == 6) {
						pc.sendPackets(new S_NPCTalkReturn(pc.getId(),
								"thirdtmape"));
					} else if (pc.getQuest().get_step(L1Quest.QUEST_LUKEIN1) == 7) {
						pc.sendPackets(new S_NPCTalkReturn(pc.getId(),
								"thirdtmapf"));
					} else if (pc.getQuest().get_step(L1Quest.QUEST_LUKEIN1) == 8) {
						pc.sendPackets(new S_NPCTalkReturn(pc.getId(),
								"thirdtmapg"));
					} else if (pc.getQuest().get_step(L1Quest.QUEST_LUKEIN1) == 9) {
						pc.sendPackets(new S_NPCTalkReturn(pc.getId(),
								"thirdtmaph"));
					} else if (pc.getQuest().get_step(L1Quest.QUEST_LUKEIN1) == 10) {
						pc.sendPackets(new S_NPCTalkReturn(pc.getId(),
								"thirdtmapi"));
					}
				} else if (itemId == 40663) { // 息子の手紙
					pc
							.sendPackets(new S_NPCTalkReturn(pc.getId(),
									"sonsletter"));
				} else if (itemId == 40630) { // ディエゴの古い日記
					pc
							.sendPackets(new S_NPCTalkReturn(pc.getId(),
									"diegodiary"));
				} else if (itemId == 41340) { // 傭兵団長 ティオンの紹介状
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "tion"));
				} else if (itemId == 41317) { // ラルソンの推薦状
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "rarson"));
				} else if (itemId == 41318) { // クエンのメモ
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "kuen"));
				} else if (itemId == 41329) { // 剥製の製作依頼書
					pc
							.sendPackets(new S_NPCTalkReturn(pc.getId(),
									"anirequest"));
				} else if (itemId == 41346) { // ロビンフッドのメモ1
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(),
							"robinscroll"));
				} else if (itemId == 41347) { // ロビンフッドのメモ2
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(),
							"robinscroll2"));
				} else if (itemId == 41348) { // ロビンフッドの紹介状
					pc
							.sendPackets(new S_NPCTalkReturn(pc.getId(),
									"robinhood"));
				} else if (itemId == 41007) { // イリスの命令書：霊魂の安息
					pc
							.sendPackets(new S_NPCTalkReturn(pc.getId(),
									"erisscroll"));
				} else if (itemId == 41009) { // イリスの命令書：同盟の意志
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(),
							"erisscroll2"));
				} else if (itemId == 41019) { // ラスタバド歴史書１章
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(),
							"lashistory1"));
				} else if (itemId == 41020) { // ラスタバド歴史書２章
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(),
							"lashistory2"));
				} else if (itemId == 41021) { // ラスタバド歴史書３章
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(),
							"lashistory3"));
				} else if (itemId == 41022) { // ラスタバド歴史書４章
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(),
							"lashistory4"));
				} else if (itemId == 41023) { // ラスタバド歴史書５章
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(),
							"lashistory5"));
				} else if (itemId == 41024) { // ラスタバド歴史書６章
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(),
							"lashistory6"));
				} else if (itemId == 41025) { // ラスタバド歴史書７章
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(),
							"lashistory7"));
				} else if (itemId == 41026) { // ラスタバド歴史書８章
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(),
							"lashistory8"));
				} else if (itemId == 41208) { // 散りゆく魂
					if ((pc.getX() >= 32844 && pc.getX() <= 32845)
							&& (pc.getY() >= 32693 && pc.getY() <= 32694)
							&& pc.getMapId() == 550) { // 船の墓場:地上層
						L1Teleport.teleport(pc, ((L1EtcItem) l1iteminstance
								.getItem()).get_locx(),
								((L1EtcItem) l1iteminstance.getItem())
										.get_locy(),
								((L1EtcItem) l1iteminstance.getItem())
										.get_mapid(), 5, true);
					} else {
						// \f1何も起きませんでした。
						pc.sendPackets(new S_ServerMessage(79));
					}
				} else if (itemId == 40700) { // シルバーフルート
					pc.sendPackets(new S_Sound(10));
					pc.broadcastPacket(new S_Sound(10));
					if ((pc.getX() >= 32619 && pc.getX() <= 32623)
							&& (pc.getY() >= 33120 && pc.getY() <= 33124)
							&& pc.getMapId() == 440) { // 海賊島前半魔方陣座標
						boolean found = false;
						for (L1Object obj : L1World.getInstance().getObject()) {
							if (obj instanceof L1MonsterInstance) {
								L1MonsterInstance mob = (L1MonsterInstance) obj;
								if (mob != null) {
									if (mob.getNpcTemplate().get_npcId() == 45875) {
										found = true;
										break;
									}
								}
							}
						}
						if (found) {
						} else {
							L1SpawnUtil.spawn(pc, 45875, 0, 0); // ラバーボーンヘッド
						}
					}
				} else if (itemId == 41121) { // カヘルの契約書
					if (pc.getQuest().get_step(L1Quest.QUEST_SHADOWS) == L1Quest.QUEST_END
							|| pc.getInventory().checkItem(41122, 1)) {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした
						// 。
					} else {
						L1ItemUtil.createNewItem(pc, 41122, 1);
					}
				} else if (itemId == 41130) { // 血痕の契約書
					if (pc.getQuest().get_step(L1Quest.QUEST_DESIRE) == L1Quest.QUEST_END
							|| pc.getInventory().checkItem(41131, 1)) {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした
						// 。
					} else {
						L1ItemUtil.createNewItem(pc, 41131, 1);
					}
				} else if (itemId == 42501) { // ストームウォーク
					if (pc.getCurrentMp() < 10) {
						pc.sendPackets(new S_ServerMessage(278)); // \
						// f1MPが不足していて魔法を使うことができません
						// 。
						return;
					}
					pc.setCurrentMp(pc.getCurrentMp() - 10);
					// pc.sendPackets(new S_CantMove()); // テレポート後に移動不可能になる場合がある
					L1Teleport.teleport(pc, spellsc_x, spellsc_y,
							pc.getMapId(), pc.getHeading(), true,
							L1Teleport.CHANGE_POSITION);
				} else if (itemId == 41293 || itemId == 41294) { // 釣り竿
					startFishing(pc, itemId, fishX, fishY);
				} else if (itemId == 41245) { // 溶解剤
					useResolvent(pc, l1iteminstance1, l1iteminstance);
				} else if (l1iteminstance.getItem().getType() == 17) { // マジックドール類
					useMagicDoll(pc, itemId, itemObjid);
				} else if (itemId >= 41255 && itemId <= 41259) { // 料理の本
					if (cookStatus == 0) {
						pc.sendPackets(new S_PacketBox(S_PacketBox.COOK_WINDOW,
								(itemId - 41255)));
					} else {
						L1Cooking.makeCooking(pc, cookNo);
					}
				} else if (itemId == 41260) { // 薪
					for (L1Object object : L1World.getInstance()
							.getVisibleObjects(pc, 3)) {
						if (object instanceof L1EffectInstance) {
							if (((L1NpcInstance) object).getNpcTemplate()
									.get_npcId() == 81170) {
								// すでに周囲に焚き火があります。
								pc.sendPackets(new S_ServerMessage(1162));
								return;
							}
						}
					}
					int[] loc = new int[2];
					loc = pc.getFrontLoc();
					L1EffectSpawn.getInstance().spawnEffect(81170, 600000,
							loc[0], loc[1], pc.getMapId());
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId >= 41277 && itemId <= 41292
						|| itemId >= 49049 && itemId <= 49064
						|| itemId >= 49244 && itemId <= 49259) { // 料理
					L1Cooking.useCookingItem(pc, l1iteminstance);
				} else if (itemId >= 41383 && itemId <= 41400) { // 家具
					useFurnitureItem(pc, itemId, itemObjid);
				} else if (itemId == 41401) { // 家具除去ワンド
					useFurnitureRemovalWand(pc, spellsc_objid, l1iteminstance);
				} else if (itemId == 41411) { // 銀のチョンズ
					UseHeallingPotion(pc, 10, 189);
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 41345) { // 酸性の乳液
					L1DamagePoison.doInfection(pc, pc, 3000, 5);
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 41315) { // 聖水
					if (pc.hasSkillEffect(STATUS_HOLY_WATER_OF_EVA)) {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした
						// 。
						return;
					}
					if (pc.hasSkillEffect(STATUS_HOLY_MITHRIL_POWDER)) {
						pc.removeSkillEffect(STATUS_HOLY_MITHRIL_POWDER);
					}
					pc.setSkillEffect(STATUS_HOLY_WATER, 900 * 1000);
					pc.sendPackets(new S_SkillSound(pc.getId(), 190));
					pc.broadcastPacket(new S_SkillSound(pc.getId(), 190));
					pc.sendPackets(new S_ServerMessage(1141));
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 41316) { // 神聖なミスリル パウダー
					if (pc.hasSkillEffect(STATUS_HOLY_WATER_OF_EVA)) {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした
						// 。
						return;
					}
					if (pc.hasSkillEffect(STATUS_HOLY_WATER)) {
						pc.removeSkillEffect(STATUS_HOLY_WATER);
					}
					pc.setSkillEffect(STATUS_HOLY_MITHRIL_POWDER, 900 * 1000);
					pc.sendPackets(new S_SkillSound(pc.getId(), 190));
					pc.broadcastPacket(new S_SkillSound(pc.getId(), 190));
					pc.sendPackets(new S_ServerMessage(1142));
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 41354) { // 神聖なエヴァの水
					if (pc.hasSkillEffect(STATUS_HOLY_WATER)
							|| pc.hasSkillEffect(STATUS_HOLY_MITHRIL_POWDER)) {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした
						// 。
						return;
					}
					pc.setSkillEffect(STATUS_HOLY_WATER_OF_EVA, 900 * 1000);
					pc.sendPackets(new S_SkillIconAura(221, 900, 5));
					pc.sendPackets(new S_SkillSound(pc.getId(), 190));
					pc.broadcastPacket(new S_SkillSound(pc.getId(), 190));
					pc.sendPackets(new S_ServerMessage(1140));
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 49092) { // 歪みのコア
					int targetItemId = l1iteminstance1.getItem().getItemId();
					if (targetItemId == 49095 || targetItemId == 49099) { // 閉ざされたオシリスの宝箱
						L1ItemUtil.createNewItem(pc, targetItemId + 1, 1);
						pc.getInventory().consumeItem(targetItemId, 1);
						pc.getInventory().consumeItem(49092, 1);
					} else {
						if (targetItemId == 49312) { // 閉ざされた上級ククルカンの宝箱
							L1ItemUtil.createNewItem(pc, 49311, 1);
							pc.getInventory().consumeItem(targetItemId, 1);
							pc.getInventory().consumeItem(49092, 1);
						} else {
							if (targetItemId == 49313) { // 閉ざされた下級ククルカンの宝箱
								L1ItemUtil.createNewItem(pc, 49310, 1);
								pc.getInventory().consumeItem(targetItemId, 1);
								pc.getInventory().consumeItem(49092, 1);
							} else {
								pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
								return;
							}
						}
					}
				} else if (itemId == 49093) { // 下級オシリスの宝箱の欠片：上
					if (pc.getInventory().checkItem(49094, 1)) {
						pc.getInventory().consumeItem(49093, 1);
						pc.getInventory().consumeItem(49094, 1);
						L1ItemUtil.createNewItem(pc, 49095, 1);
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
					}
				} else if (itemId == 49094) { // 下級オシリスの宝箱の欠片：下
					if (pc.getInventory().checkItem(49093, 1)) {
						pc.getInventory().consumeItem(49093, 1);
						pc.getInventory().consumeItem(49094, 1);
						L1ItemUtil.createNewItem(pc, 49095, 1);
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
					}
				} else if (itemId == 49097) { // 上級オシリスの宝箱の欠片：上
					if (pc.getInventory().checkItem(49098, 1)) {
						pc.getInventory().consumeItem(49097, 1);
						pc.getInventory().consumeItem(49098, 1);
						L1ItemUtil.createNewItem(pc, 49099, 1);
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
					}
				} else if (itemId == 49098) { // 上級オシリスの宝箱の欠片：下
					if (pc.getInventory().checkItem(49097, 1)) {
						pc.getInventory().consumeItem(49097, 1);
						pc.getInventory().consumeItem(49098, 1);
						L1ItemUtil.createNewItem(pc, 49099, 1);
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
					}
				} else if (itemId == 41426) { // 封印スクロール
					L1ItemInstance lockItem = pc.getInventory().getItem(l);
					if (lockItem != null && lockItem.getItem().getType2() == 1
							|| lockItem.getItem().getType2() == 2
							|| lockItem.getItem().getType2() == 0
							&& lockItem.getItem().isCanSeal()) {
						if (!lockItem.isSealed()) {
							lockItem.setSealed(true);
							pc.getInventory().updateItem(lockItem,
									L1PcInventory.COL_BLESS);
							pc.getInventory().saveItem(lockItem);
							pc.getInventory().removeItem(l1iteminstance, 1);
						} else {
							pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでしたF。
						}
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
					}
				} else if (itemId == 41427) { // 封印解除スクロール
					L1ItemInstance lockItem = pc.getInventory().getItem(l);
					if (lockItem != null && lockItem.getItem().getType2() == 1
							|| lockItem.getItem().getType2() == 2
							|| lockItem.getItem().getType2() == 0
							&& lockItem.getItem().isCanSeal()) {
						if (lockItem.isSealed()) {
							lockItem.setSealed(false);
							pc.getInventory().updateItem(lockItem,
									L1PcInventory.COL_BLESS);
							pc.getInventory().saveItem(lockItem);
							pc.getInventory().removeItem(l1iteminstance, 1);
						} else {
							pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
						}
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
					}
				} else if (itemId == 41428) { // 太古の玉爾
					if (pc != null && l1iteminstance != null) {
						L1Account account = L1Account.findByName(pc
								.getAccountName());
						if (account == null) {
							pc.sendPackets(new S_ServerMessage(79)); // \
							// f1何も起きませんでした
							// 。
							return;
						}
						int characterSlot = account.getCharacterSlot();
						int maxAmount = Config.DEFAULT_CHARACTER_SLOT
								+ characterSlot;
						if (maxAmount >= 8) {
							pc.sendPackets(new S_ServerMessage(79)); // \
							// f1何も起きませんでした
							// 。
							return;
						}
						if (characterSlot < 0) {
							characterSlot = 0;
						} else {
							characterSlot += 1;
						}
						account.setCharacterSlot(characterSlot);
						account.updateCharacterSlot();
						pc.getInventory().removeItem(l1iteminstance, 1);
					} else {
						pc.sendPackets(new S_ServerMessage(79));
					}
				} else if (itemId == 40075) { // 防具破壊スクロール
					if (l1iteminstance1.getItem().getType2() == 2) {
						int msg = 0;
						switch (l1iteminstance1.getItem().getType()) {
						case 1: // helm
							msg = 171; // \f1ヘルムが塵になり、風に飛んでいきます。
							break;
						case 2: // armor
							msg = 169; // \f1アーマーが壊れ、下に落ちました。
							break;
						case 3: // T
							msg = 170; // \f1シャツが細かい糸になり、破けて落ちました。
							break;
						case 4: // cloak
							msg = 168; // \f1マントが破れ、塵になりました。
							break;
						case 5: // glove
							msg = 172; // \f1グローブが消えました。
							break;
						case 6: // boots
							msg = 173; // \f1靴がバラバラになりました。
							break;
						case 7: // shield
							msg = 174; // \f1シールドが壊れました。
							break;
						default:
							msg = 167; // \f1肌がムズムズします。
							break;
						}
						pc.sendPackets(new S_ServerMessage(msg));
						pc.getInventory().removeItem(l1iteminstance1, 1);
					} else {
						pc.sendPackets(new S_ServerMessage(154)); // \
						// f1スクロールが散らばります
						// 。
					}
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 49210) { // プロケルの1番目の指令書
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "first_p"));
				} else if (itemId == 49211) { // プロケルの2番目の指令書
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "second_p"));
				} else if (itemId == 49212) { // プロケルの3番目の指令書
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "third_p"));
				} else if (itemId == 49287) { // プロケルの4番目の指令書
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "fourth_p"));
				} else if (itemId == 49288) { // プロケルの5番目の指令書
					pc.sendPackets(new S_NPCTalkReturn(pc.getId(), "fifth_p"));
				} else if (itemId == 49222) { // オーク密使の笛
					if (pc.isDragonKnight() && pc.getMapId() == 61) { // HC3F
						boolean found = false;
						for (L1Object obj : L1World.getInstance().getObject()) {
							if (obj instanceof L1MonsterInstance) {
								L1MonsterInstance mob = (L1MonsterInstance) obj;
								if (mob != null) {
									if (mob.getNpcTemplate().get_npcId() == 46161) {
										found = true;
										break;
									}
								}
							}
						}
						if (found) {
							pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
						} else {
							L1SpawnUtil.spawn(pc, 46161, 0, 0); // オーク 密使リーダー
						}
						pc.getInventory().consumeItem(49222, 1);
					}

				} else if (itemId == 49168) { // XXX 破壊の秘薬　
					pc.setSkillEffect(STATUS_DESTRUCTION_NOSTRUM, 600 * 1000);
					pc.sendPackets(new S_SkillIconAura(221, 600, 6));
					pc.sendPackets(new S_SkillSound(pc.getId(), 190));
					pc.broadcastPacket(new S_SkillSound(pc.getId(), 190));
					pc.sendPackets(new S_ServerMessage(1382));
					pc.getInventory().removeItem(l1iteminstance, 1);
				} else if (itemId == 49316) { // 下級ククルカンの宝箱の欠片：上
					if (pc.getInventory().checkItem(49317, 1)) {
						pc.getInventory().consumeItem(49317, 1);
						pc.getInventory().consumeItem(49316, 1);
						L1ItemUtil.createNewItem(pc, 49313, 1);
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした
						// 。
					}
				} else if (itemId == 49317) { // 下級ククルカンの宝箱の欠片：下
					if (pc.getInventory().checkItem(49316, 1)) {
						pc.getInventory().consumeItem(49316, 1);
						pc.getInventory().consumeItem(49317, 1);
						L1ItemUtil.createNewItem(pc, 49313, 1);
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした
						// 。
					}
				} else if (itemId == 49314) { // 上級ククルカンの宝箱の欠片：上
					if (pc.getInventory().checkItem(49315, 1)) {
						pc.getInventory().consumeItem(49314, 1);
						pc.getInventory().consumeItem(49315, 1);
						L1ItemUtil.createNewItem(pc, 49312, 1);
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした
						// 。
					}
				} else if (itemId == 49315) { // 上級ククルカンの宝箱の欠片：下
					if (pc.getInventory().checkItem(49314, 1)) {
						pc.getInventory().consumeItem(49315, 1);
						pc.getInventory().consumeItem(49314, 1);
						L1ItemUtil.createNewItem(pc, 49312, 1);
					} else {
						pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした
						// 。
					}
				} else {
					int locX = ((L1EtcItem) l1iteminstance.getItem())
							.get_locx();
					int locY = ((L1EtcItem) l1iteminstance.getItem())
							.get_locy();
					short mapId = ((L1EtcItem) l1iteminstance.getItem())
							.get_mapid();
					if (locX != 0 && locY != 0) { // 各種テレポートスクロール
						if (pc.getMap().isEscapable() || pc.isGm()) {
							L1Teleport.teleport(pc, locX, locY, mapId, pc
									.getHeading(), true);
							pc.getInventory().removeItem(l1iteminstance, 1);
						} else {
							pc.sendPackets(new S_ServerMessage(647));
						}
						cancelAbsoluteBarrier(pc); // アブソルート バリアの解除
					} else {
						if (l1iteminstance.getCount() < 1) { // あり得ない？
							pc.sendPackets(new S_ServerMessage(329,
									l1iteminstance.getLogName())); // \f1%0を持っていません。
						} else {
							pc.sendPackets(new S_ServerMessage(74,
									l1iteminstance.getLogName())); // \f1%0
							// は使用できません。
						}
					}
				}

			} else if (l1iteminstance.getItem().getType2() == 1) {
				// 種別：武器
				int min = l1iteminstance.getItem().getMinLevel();
				int max = l1iteminstance.getItem().getMaxLevel();
				if (min != 0 && min > pc.getLevel()) {
					// このアイテムは%0レベル以上にならなければ使用できません。
					pc
							.sendPackets(new S_ServerMessage(318, String
									.valueOf(min)));
				} else if (max != 0 && max < pc.getLevel()) {
					// このアイテムは%dレベル以下のみ使用できます。
					// S_ServerMessageでは引数が表示されない
					if (max < 50) {
						pc.sendPackets(new S_PacketBox(
								S_PacketBox.MSG_LEVEL_OVER, max));
					} else {
						pc.sendPackets(new S_SystemMessage("このアイテムは" + max
								+ "レベル以下のみ使用できます。"));
					}
				} else {
					if (pc.isCrown() && l1iteminstance.getItem().isUseRoyal()
							|| pc.isKnight()
							&& l1iteminstance.getItem().isUseKnight()
							|| pc.isElf()
							&& l1iteminstance.getItem().isUseElf()
							|| pc.isWizard()
							&& l1iteminstance.getItem().isUseMage()
							|| pc.isDarkelf()
							&& l1iteminstance.getItem().isUseDarkelf()
							|| pc.isDragonKnight()
							&& l1iteminstance.getItem().isUseDragonknight()
							|| pc.isIllusionist()
							&& l1iteminstance.getItem().isUseIllusionist()) {
						UseWeapon(pc, l1iteminstance);
					} else {
						// \f1あなたのクラスではこのアイテムは使用できません。
						pc.sendPackets(new S_ServerMessage(264));
					}
				}
			} else if (l1iteminstance.getItem().getType2() == 2) { // 種別：防具
				if (pc.isCrown() && l1iteminstance.getItem().isUseRoyal()
						|| pc.isKnight()
						&& l1iteminstance.getItem().isUseKnight() || pc.isElf()
						&& l1iteminstance.getItem().isUseElf() || pc.isWizard()
						&& l1iteminstance.getItem().isUseMage()
						|| pc.isDarkelf()
						&& l1iteminstance.getItem().isUseDarkelf()
						|| pc.isDragonKnight()
						&& l1iteminstance.getItem().isUseDragonknight()
						|| pc.isIllusionist()
						&& l1iteminstance.getItem().isUseIllusionist()) {

					int min = ((L1Armor) l1iteminstance.getItem())
							.getMinLevel();
					int max = ((L1Armor) l1iteminstance.getItem())
							.getMaxLevel();
					if (min != 0 && min > pc.getLevel()) {
						// このアイテムは%0レベル以上にならなければ使用できません。
						pc.sendPackets(new S_ServerMessage(318, String
								.valueOf(min)));
					} else if (max != 0 && max < pc.getLevel()) {
						// このアイテムは%dレベル以下のみ使用できます。
						// S_ServerMessageでは引数が表示されない
						if (max < 50) {
							pc.sendPackets(new S_PacketBox(
									S_PacketBox.MSG_LEVEL_OVER, max));
						} else {
							pc.sendPackets(new S_SystemMessage("このアイテムは" + max
									+ "レベル以下のみ使用できます。"));
						}
					} else {
						UseArmor(pc, l1iteminstance);
					}
				} else {
					// \f1あなたのクラスではこのアイテムは使用できません。
					pc.sendPackets(new S_ServerMessage(264));
				}
			}

			// 効果ディレイがある場合は現在時間をセット
			if (isDelayEffect) {
				Timestamp ts = new Timestamp(System.currentTimeMillis());
				l1iteminstance.setLastUsed(ts);
				pc.getInventory().updateItem(l1iteminstance,
						L1PcInventory.COL_DELAY_EFFECT);
				pc.getInventory().saveItem(l1iteminstance);
			}

			L1ItemDelay.onItemUse(client, l1iteminstance); // アイテムディレイ開始
		}
	}

	private void SuccessEnchant(L1PcInstance pc, L1ItemInstance item,
			ClientThread client, int i) {
		String s = "";
		String sa = "";
		String sb = "";
		String s1 = item.getName();
		String pm = "";
		if (item.getEnchantLevel() > 0) {
			pm = "+";
		}
		if (item.getItem().getType2() == 1) {
			if (!item.isIdentified() || item.getEnchantLevel() == 0) {
				switch (i) {
				case -1:
					s = s1;
					sa = "$246";
					sb = "$247";
					break;

				case 1: // '\001'
					s = s1;
					sa = "$245";
					sb = "$247";
					break;

				case 2: // '\002'
					s = s1;
					sa = "$245";
					sb = "$248";
					break;

				case 3: // '\003'
					s = s1;
					sa = "$245";
					sb = "$248";
					break;
				}
			} else {
				switch (i) {
				case -1:
					s = (new StringBuilder()).append(
							pm + item.getEnchantLevel()).append(" ").append(s1)
							.toString(); // \f1%0が%2%1光ります。
					sa = "$246";
					sb = "$247";
					break;

				case 1: // '\001'
					s = (new StringBuilder()).append(
							pm + item.getEnchantLevel()).append(" ").append(s1)
							.toString(); // \f1%0が%2%1光ります。
					sa = "$245";
					sb = "$247";
					break;

				case 2: // '\002'
					s = (new StringBuilder()).append(
							pm + item.getEnchantLevel()).append(" ").append(s1)
							.toString(); // \f1%0が%2%1光ります。
					sa = "$245";
					sb = "$248";
					break;

				case 3: // '\003'
					s = (new StringBuilder()).append(
							pm + item.getEnchantLevel()).append(" ").append(s1)
							.toString(); // \f1%0が%2%1光ります。
					sa = "$245";
					sb = "$248";
					break;
				}
			}
		} else if (item.getItem().getType2() == 2) {
			if (!item.isIdentified() || item.getEnchantLevel() == 0) {
				switch (i) {
				case -1:
					s = s1;
					sa = "$246";
					sb = "$247";
					break;

				case 1: // '\001'
					s = s1;
					sa = "$252";
					sb = "$247 ";
					break;

				case 2: // '\002'
					s = s1;
					sa = "$252";
					sb = "$248 ";
					break;

				case 3: // '\003'
					s = s1;
					sa = "$252";
					sb = "$248 ";
					break;
				}
			} else {
				switch (i) {
				case -1:
					s = (new StringBuilder()).append(
							pm + item.getEnchantLevel()).append(" ").append(s1)
							.toString(); // \f1%0が%2%1光ります。
					sa = "$246";
					sb = "$247";
					break;

				case 1: // '\001'
					s = (new StringBuilder()).append(
							pm + item.getEnchantLevel()).append(" ").append(s1)
							.toString(); // \f1%0が%2%1光ります。
					sa = "$252";
					sb = "$247 ";
					break;

				case 2: // '\002'
					s = (new StringBuilder()).append(
							pm + item.getEnchantLevel()).append(" ").append(s1)
							.toString(); // \f1%0が%2%1光ります。
					sa = "$252";
					sb = "$248 ";
					break;

				case 3: // '\003'
					s = (new StringBuilder()).append(
							pm + item.getEnchantLevel()).append(" ").append(s1)
							.toString(); // \f1%0が%2%1光ります。
					sa = "$252";
					sb = "$248 ";
					break;
				}
			}
		}
		pc.sendPackets(new S_ServerMessage(161, s, sa, sb));
		int oldEnchantLvl = item.getEnchantLevel();
		int newEnchantLvl = item.getEnchantLevel() + i;
		int safe_enchant = item.getItem().get_safeenchant();
		item.setEnchantLevel(newEnchantLvl);
		client.getActiveChar().getInventory().updateItem(item,
				L1PcInventory.COL_ENCHANTLVL);
		if (newEnchantLvl > safe_enchant) {
			client.getActiveChar().getInventory().saveItem(item);
		}
		if (item.getItem().getType2() == 1
				&& Config.LOGGING_WEAPON_ENCHANT != 0) {
			if (safe_enchant == 0
					|| newEnchantLvl >= Config.LOGGING_WEAPON_ENCHANT) {
				LogEnchantTable logenchant = new LogEnchantTable();
				logenchant.storeLogEnchant(pc.getId(), item.getId(),
						oldEnchantLvl, newEnchantLvl);
			}
		}
		if (item.getItem().getType2() == 2 && Config.LOGGING_ARMOR_ENCHANT != 0) {
			if (safe_enchant == 0
					|| newEnchantLvl >= Config.LOGGING_ARMOR_ENCHANT) {
				LogEnchantTable logenchant = new LogEnchantTable();
				logenchant.storeLogEnchant(pc.getId(), item.getId(),
						oldEnchantLvl, newEnchantLvl);
			}
		}

		if (item.getItem().getType2() == 2) {
			if (item.isEquipped()) {
				pc.addAc(-i);
				int i2 = item.getItem().getItemId();
				if (i2 == 20011 || i2 == 20110 || i2 == 21108 || i2 == 120011) { // マジックヘルム、マジックチェーンメイル、キャラクター名の魔法抵抗のＴシャツ
					pc.addMr(i);
					pc.sendPackets(new S_SPMR(pc));
				}
				if (i2 == 20056 || i2 == 120056 || i2 == 220056) { // マジック クローク
					pc.addMr(i * 2);
					pc.sendPackets(new S_SPMR(pc));
				}
			}
			pc.sendPackets(new S_OwnCharStatus(pc));
		}
	}

	private void FailureEnchant(L1PcInstance pc, L1ItemInstance item,
			ClientThread client) {
		String s = "";
		String sa = "";
		int itemType = item.getItem().getType2();
		String nameId = item.getName();
		String pm = "";
		if (itemType == 1) { // 武器
			if (!item.isIdentified() || item.getEnchantLevel() == 0) {
				s = nameId; // \f1%0が強烈に%1光ったあと、蒸発してなくなります。
				sa = "$245";
			} else {
				if (item.getEnchantLevel() > 0) {
					pm = "+";
				}
				s = (new StringBuilder()).append(pm + item.getEnchantLevel())
						.append(" ").append(nameId).toString(); // \f1%0が強烈に%1
				// 光ったあと
				// 、蒸発してなくなります。
				sa = "$245";
			}
		} else if (itemType == 2) { // 防具
			if (!item.isIdentified() || item.getEnchantLevel() == 0) {
				s = nameId; // \f1%0が強烈に%1光ったあと、蒸発してなくなります。
				sa = " $252";
			} else {
				if (item.getEnchantLevel() > 0) {
					pm = "+";
				}
				s = (new StringBuilder()).append(pm + item.getEnchantLevel())
						.append(" ").append(nameId).toString(); // \f1%0が強烈に%1
				// 光ったあと
				// 、蒸発してなくなります。
				sa = " $252";
			}
		}
		pc.sendPackets(new S_ServerMessage(164, s, sa));
		pc.getInventory().removeItem(item, item.getCount());
	}

	@SuppressWarnings("unused")
	private int EnchantChance(L1ItemInstance l1iteminstance) {
		byte byte0 = 0;
		int i = l1iteminstance.getEnchantLevel();
		if (l1iteminstance.getItem().getType2() == 1) {
			switch (i) {
			case 0: // '\0'
				byte0 = 50;
				break;

			case 1: // '\001'
				byte0 = 33;
				break;

			case 2: // '\002'
				byte0 = 25;
				break;

			case 3: // '\003'
				byte0 = 25;
				break;

			case 4: // '\004'
				byte0 = 25;
				break;

			case 5: // '\005'
				byte0 = 20;
				break;

			case 6: // '\006'
				byte0 = 33;
				break;

			case 7: // '\007'
				byte0 = 33;
				break;

			case 8: // '\b'
				byte0 = 33;
				break;

			case 9: // '\t'
				byte0 = 25;
				break;

			case 10: // '\n'
				byte0 = 20;
				break;
			}
		} else if (l1iteminstance.getItem().getType2() == 2) {
			switch (i) {
			case 0: // '\0'
				byte0 = 50;
				break;

			case 1: // '\001'
				byte0 = 33;
				break;

			case 2: // '\002'
				byte0 = 25;
				break;

			case 3: // '\003'
				byte0 = 25;
				break;

			case 4: // '\004'
				byte0 = 25;
				break;

			case 5: // '\005'
				byte0 = 20;
				break;

			case 6: // '\006'
				byte0 = 17;
				break;

			case 7: // '\007'
				byte0 = 14;
				break;

			case 8: // '\b'
				byte0 = 12;
				break;

			case 9: // '\t'
				byte0 = 11;
				break;
			}
		}
		return byte0;
	}

	private void UseHeallingPotion(L1PcInstance pc, int healHp, int gfxid) {
		if (pc.hasSkillEffect(71) == true) { // ディケイ ポーションの状態
			pc.sendPackets(new S_ServerMessage(698)); // 魔力によって何も飲むことができません。
			return;
		}

		// アブソルート バリアの解除
		cancelAbsoluteBarrier(pc);

		pc.sendPackets(new S_SkillSound(pc.getId(), gfxid));
		pc.broadcastPacket(new S_SkillSound(pc.getId(), gfxid));
		if (pc.getPotLog() == true) {// TODO POTLOG判定　
			pc.sendPackets(new S_ServerMessage(77)); // \f1気分が良くなりました。
		}
		healHp *= (_randomForGaussian.nextGaussian() / 5.0D) + 1.0D;
		if (pc.hasSkillEffect(POLLUTE_WATER)) { // ポルートウォーター中は回復量1/2倍
			healHp /= 2;
		}
		pc.setCurrentHp(pc.getCurrentHp() + healHp);
	}

	private void useGreenPotion(L1PcInstance pc, int itemId) {
		if (pc.hasSkillEffect(71) == true) { // ディケイポーションの状態
			pc.sendPackets(new S_ServerMessage(698)); // \f1魔力によって何も飲むことができません。
			return;
		}

		// アブソルート バリアの解除
		cancelAbsoluteBarrier(pc);

		int time = 0;
		if (itemId == L1ItemId.POTION_OF_HASTE_SELF) { // グリーン ポーション
			time = 300;
		} else if (itemId == L1ItemId.B_POTION_OF_HASTE_SELF) { // 祝福されたグリーン
			// ポーション
			time = 350;
		} else if (itemId == 40018 || itemId == 41338 || itemId == 41342) { // 強化グリーンポーション
			// 、
			// 祝福されたワイン
			// 、
			// メデューサの血
			time = 1800;
		} else if (itemId == 140018) { // 祝福された強化グリーン ポーション
			time = 2100;
		} else if (itemId == 40039) { // ワイン
			time = 600;
		} else if (itemId == 40040) { // ウイスキー
			time = 900;
		} else if (itemId == 40030) { // 象牙の塔のヘイスト ポーション
			time = 300;
		} else if (itemId == 41261 || itemId == 41262 || itemId == 41268
				|| itemId == 41269 || itemId == 41271 || itemId == 41272
				|| itemId == 41273) {
			time = 30;
		}

		pc.sendPackets(new S_SkillSound(pc.getId(), 191));
		pc.broadcastPacket(new S_SkillSound(pc.getId(), 191));
		// XXX:ヘイストアイテム装備時、酔った状態が解除されるのか不明
		if (pc.getHasteItemEquipped() > 0) {
			return;
		}
		// 酔った状態を解除
		pc.setDrink(false);

		// ヘイスト、グレーターヘイストとは重複しない
		if (pc.hasSkillEffect(HASTE)) {
			pc.killSkillEffectTimer(HASTE);
			pc.sendPackets(new S_SkillHaste(pc.getId(), 0, 0));
			pc.broadcastPacket(new S_SkillHaste(pc.getId(), 0, 0));
			pc.setMoveSpeed(0);
		} else if (pc.hasSkillEffect(GREATER_HASTE)) {
			pc.killSkillEffectTimer(GREATER_HASTE);
			pc.sendPackets(new S_SkillHaste(pc.getId(), 0, 0));
			pc.broadcastPacket(new S_SkillHaste(pc.getId(), 0, 0));
			pc.setMoveSpeed(0);
		} else if (pc.hasSkillEffect(STATUS_HASTE)) {
			pc.killSkillEffectTimer(STATUS_HASTE);
			pc.sendPackets(new S_SkillHaste(pc.getId(), 0, 0));
			pc.broadcastPacket(new S_SkillHaste(pc.getId(), 0, 0));
			pc.setMoveSpeed(0);
		}

		// スロー、マス スロー、エンタングル中はスロー状態を解除するだけ
		if (pc.hasSkillEffect(SLOW)) { // スロー
			pc.killSkillEffectTimer(SLOW);
			pc.sendPackets(new S_SkillHaste(pc.getId(), 0, 0));
			pc.broadcastPacket(new S_SkillHaste(pc.getId(), 0, 0));
		} else if (pc.hasSkillEffect(MASS_SLOW)) { // マス スロー
			pc.killSkillEffectTimer(MASS_SLOW);
			pc.sendPackets(new S_SkillHaste(pc.getId(), 0, 0));
			pc.broadcastPacket(new S_SkillHaste(pc.getId(), 0, 0));
		} else if (pc.hasSkillEffect(ENTANGLE)) { // エンタングル
			pc.killSkillEffectTimer(ENTANGLE);
			pc.sendPackets(new S_SkillHaste(pc.getId(), 0, 0));
			pc.broadcastPacket(new S_SkillHaste(pc.getId(), 0, 0));
		} else {
			pc.sendPackets(new S_SkillHaste(pc.getId(), 1, time));
			pc.broadcastPacket(new S_SkillHaste(pc.getId(), 1, 0));
			pc.setMoveSpeed(1);
			pc.setSkillEffect(STATUS_HASTE, time * 1000);
		}
	}

	private void useBravePotion(L1PcInstance pc, int item_id) {
		if (pc.hasSkillEffect(71) == true) { // ディケイポーションの状態
			pc.sendPackets(new S_ServerMessage(698)); // \f1魔力によって何も飲むことができません。
			return;
		}

		// アブソルート バリアの解除
		cancelAbsoluteBarrier(pc);

		int time = 0;
		if (item_id == L1ItemId.POTION_OF_EMOTION_BRAVERY) { // ブレイブ ポーション
			time = 300;
		} else if (item_id == L1ItemId.B_POTION_OF_EMOTION_BRAVERY) { // 祝福されたブレイブポーション
			time = 350;
		} else if (item_id == 49158) { // ユグドラの実
			time = 480;
			if (pc.hasSkillEffect(STATUS_BRAVE)) { // 名誉のコインとは重複しない
				pc.killSkillEffectTimer(STATUS_BRAVE);
				pc.sendPackets(new S_SkillBrave(pc.getId(), 0, 0));
				pc.broadcastPacket(new S_SkillBrave(pc.getId(), 0, 0));
				pc.setBraveSpeed(0);
			}
		} else if (item_id == 41415) { // 強化ブレイブ ポーション
			time = 1800;
		} else if (item_id == 40068) { // エルヴン ワッフル
			time = 600;
			if (pc.hasSkillEffect(STATUS_BRAVE)) { // 名誉のコインとは重複しない
				pc.killSkillEffectTimer(STATUS_BRAVE);
				pc.sendPackets(new S_SkillBrave(pc.getId(), 0, 0));
				pc.broadcastPacket(new S_SkillBrave(pc.getId(), 0, 0));
				pc.setBraveSpeed(0);
			}
			if (pc.hasSkillEffect(WIND_WALK)) { // ウィンドウォークとは重複しない
				pc.killSkillEffectTimer(WIND_WALK);
				pc.sendPackets(new S_SkillBrave(pc.getId(), 0, 0));
				pc.broadcastPacket(new S_SkillBrave(pc.getId(), 0, 0));
				pc.setBraveSpeed(0);
			}
		} else if (item_id == 140068) { // 祝福されたエルヴン ワッフル
			time = 700;
			if (pc.hasSkillEffect(STATUS_BRAVE)) { // 名誉のコインとは重複しない
				pc.killSkillEffectTimer(STATUS_BRAVE);
				pc.sendPackets(new S_SkillBrave(pc.getId(), 0, 0));
				pc.broadcastPacket(new S_SkillBrave(pc.getId(), 0, 0));
				pc.setBraveSpeed(0);
			}
			if (pc.hasSkillEffect(WIND_WALK)) { // ウィンドウォークとは重複しない
				pc.killSkillEffectTimer(WIND_WALK);
				pc.sendPackets(new S_SkillBrave(pc.getId(), 0, 0));
				pc.broadcastPacket(new S_SkillBrave(pc.getId(), 0, 0));
				pc.setBraveSpeed(0);
			}
		} else if (item_id == 40031) { // イビル ブラッド
			time = 600;
		} else if (item_id == 40733) { // 名誉のコイン
			time = 600;
			if (pc.hasSkillEffect(STATUS_ELFBRAVE)) { // エルヴンワッフルとは重複しない
				pc.killSkillEffectTimer(STATUS_ELFBRAVE);
				pc.sendPackets(new S_SkillBrave(pc.getId(), 0, 0));
				pc.broadcastPacket(new S_SkillBrave(pc.getId(), 0, 0));
				pc.setBraveSpeed(0);
			}
			if (pc.hasSkillEffect(HOLY_WALK)) { // ホーリーウォークとは重複しない
				pc.killSkillEffectTimer(HOLY_WALK);
				pc.sendPackets(new S_SkillBrave(pc.getId(), 0, 0));
				pc.broadcastPacket(new S_SkillBrave(pc.getId(), 0, 0));
				pc.setBraveSpeed(0);
			}
			if (pc.hasSkillEffect(MOVING_ACCELERATION)) { // ムービングアクセレーションとは重複しない
				pc.killSkillEffectTimer(MOVING_ACCELERATION);
				pc.sendPackets(new S_SkillBrave(pc.getId(), 0, 0));
				pc.broadcastPacket(new S_SkillBrave(pc.getId(), 0, 0));
				pc.setBraveSpeed(0);
			}
			if (pc.hasSkillEffect(WIND_WALK)) { // ウィンドウォークとは重複しない
				pc.killSkillEffectTimer(WIND_WALK);
				pc.sendPackets(new S_SkillBrave(pc.getId(), 0, 0));
				pc.broadcastPacket(new S_SkillBrave(pc.getId(), 0, 0));
				pc.setBraveSpeed(0);
			}
			if (pc.hasSkillEffect(STATUS_RIBRAVE)) { // ユグドラの実とは重複しない
				pc.killSkillEffectTimer(STATUS_RIBRAVE);
				// XXX ユグドラの実のアイコンを消す方法が不明
				pc.setBraveSpeed(0);
			}
			if (pc.hasSkillEffect(BLOODLUST)) { // ブラッドラストとは重複しない
				pc.killSkillEffectTimer(BLOODLUST);
				pc.sendPackets(new S_SkillBrave(pc.getId(), 0, 0));
				pc.broadcastPacket(new S_SkillBrave(pc.getId(), 0, 0));
				pc.setBraveSpeed(0);
			}
		}

		if (item_id == 40068 || item_id == 140068) { // エルヴン ワッフル
			pc.sendPackets(new S_SkillBrave(pc.getId(), 3, time));
			pc.broadcastPacket(new S_SkillBrave(pc.getId(), 3, 0));
			pc.sendPackets(new S_SkillSound(pc.getId(), 751));
			pc.broadcastPacket(new S_SkillSound(pc.getId(), 751));
			pc.setSkillEffect(STATUS_ELFBRAVE, time * 1000);
		} else if (item_id == 49158) { // ユグドラの実
			pc.sendPackets(new S_SkillSound(pc.getId(), 7110));
			pc.broadcastPacket(new S_SkillSound(pc.getId(), 7110));
			pc.setSkillEffect(STATUS_RIBRAVE, time * 1000);
		} else {
			pc.sendPackets(new S_SkillBrave(pc.getId(), 1, time));
			pc.broadcastPacket(new S_SkillBrave(pc.getId(), 1, 0));
			pc.sendPackets(new S_SkillSound(pc.getId(), 751));
			pc.broadcastPacket(new S_SkillSound(pc.getId(), 751));
			pc.setSkillEffect(STATUS_BRAVE, time * 1000);
		}
		// pc.sendPackets(new S_SkillSound(pc.getId(), 751));
		// pc.broadcastPacket(new S_SkillSound(pc.getId(), 751));
		pc.setBraveSpeed(1);
	}

	private void useBluePotion(L1PcInstance pc, int item_id) {
		if (pc.hasSkillEffect(DECAY_POTION)) { // ディケイポーションの状態
			pc.sendPackets(new S_ServerMessage(698)); // \f1魔力によって何も飲むことができません。
			return;
		}

		// アブソルート バリアの解除
		cancelAbsoluteBarrier(pc);

		int time = 0;
		if (item_id == 40015 || item_id == 40736) { // ブルーポーション、知恵のコイン
			time = 600;
		} else if (item_id == 140015) { // 祝福されたブルー ポーション
			time = 700;
		} else {
			return;
		}

		pc.sendPackets(new S_SkillIconGFX(34, time));
		pc.sendPackets(new S_SkillSound(pc.getId(), 190));
		pc.broadcastPacket(new S_SkillSound(pc.getId(), 190));

		pc.setSkillEffect(STATUS_BLUE_POTION, time * 1000);

		pc.sendPackets(new S_ServerMessage(1007)); // MPの回復速度が速まります。
	}

	private void useWisdomPotion(L1PcInstance pc, int item_id) {
		if (pc.hasSkillEffect(71) == true) { // ディケイポーションの状態
			pc.sendPackets(new S_ServerMessage(698)); // \f1魔力によって何も飲むことができません。
			return;
		}

		// アブソルート バリアの解除
		cancelAbsoluteBarrier(pc);

		int time = 0; // 時間は4の倍数にすること
		if (item_id == L1ItemId.POTION_OF_EMOTION_WISDOM) { // ウィズダム ポーション
			time = 300;
		} else if (item_id == L1ItemId.B_POTION_OF_EMOTION_WISDOM) { // 祝福されたウィズダム
			// ポーション
			time = 360;
		}

		if (!pc.hasSkillEffect(STATUS_WISDOM_POTION)) {
			pc.addSp(2);
		}

		pc.sendPackets(new S_SkillIconWisdomPotion((time / 4)));
		pc.sendPackets(new S_SkillSound(pc.getId(), 750));
		pc.broadcastPacket(new S_SkillSound(pc.getId(), 750));

		pc.setSkillEffect(STATUS_WISDOM_POTION, time * 1000);
	}

	private void useBlessOfEva(L1PcInstance pc, int item_id) {
		if (pc.hasSkillEffect(71) == true) { // ディケイポーションの状態
			pc.sendPackets(new S_ServerMessage(698)); // \f1魔力によって何も飲むことができません。
			return;
		}

		// アブソルート バリアの解除
		cancelAbsoluteBarrier(pc);

		int time = 0;
		if (item_id == 40032) { // エヴァの祝福
			time = 1800;
		} else if (item_id == 40041) { // マーメイドの鱗
			time = 300;
		} else if (item_id == 41344) { // 水の精粋
			time = 2100;
		} else {
			return;
		}

		if (pc.hasSkillEffect(STATUS_UNDERWATER_BREATH)) {
			int timeSec = pc.getSkillEffectTimeSec(STATUS_UNDERWATER_BREATH);
			time += timeSec;
			if (time > 3600) {
				time = 3600;
			}
		}
		pc.sendPackets(new S_SkillIconBlessOfEva(pc.getId(), time));
		pc.sendPackets(new S_SkillSound(pc.getId(), 190));
		pc.broadcastPacket(new S_SkillSound(pc.getId(), 190));
		pc.setSkillEffect(STATUS_UNDERWATER_BREATH, time * 1000);
	}

	private void useBlindPotion(L1PcInstance pc) {
		if (pc.hasSkillEffect(DECAY_POTION)) {
			pc.sendPackets(new S_ServerMessage(698)); // \f1魔力によって何も飲むことができません。
			return;
		}

		// アブソルート バリアの解除
		cancelAbsoluteBarrier(pc);

		int time = 16;
		if (pc.hasSkillEffect(CURSE_BLIND)) {
			pc.killSkillEffectTimer(CURSE_BLIND);
		} else if (pc.hasSkillEffect(DARKNESS)) {
			pc.killSkillEffectTimer(DARKNESS);
		}

		if (pc.hasSkillEffect(STATUS_FLOATING_EYE)) {
			pc.sendPackets(new S_CurseBlind(2));
		} else {
			pc.sendPackets(new S_CurseBlind(1));
		}

		pc.setSkillEffect(CURSE_BLIND, time * 1000);
	}

	private boolean usePolyScroll(L1PcInstance pc, int item_id, String s) {
		int awakeSkillId = pc.getAwakeSkillId();
		if (awakeSkillId == AWAKEN_ANTHARAS || awakeSkillId == AWAKEN_FAFURION
				|| awakeSkillId == AWAKEN_VALAKAS) {
			pc.sendPackets(new S_ServerMessage(1384)); // 現在の状態では変身できません。
			return false;
		}

		int time = 0;
		if (item_id == 40088 || item_id == 40096) { // 変身スクロール、象牙の塔の変身スクロール
			time = 1800;
		} else if (item_id == 140088) { // 祝福された変身スクロール
			time = 2100;
		}

		L1PolyMorph poly = PolyTable.getInstance().getTemplate(s);
		if (poly != null || s.equals("")) {
			if (s.equals("")) {
				if (pc.getTempCharGfx() == 6034 || pc.getTempCharGfx() == 6035) {
					return true;
				} else {
					pc.removeSkillEffect(SHAPE_CHANGE);
					return true;
				}
			} else if (poly.getMinLevel() <= pc.getLevel() || pc.isGm()) {
				L1PolyMorph.doPoly(pc, poly.getPolyId(), time,
						L1PolyMorph.MORPH_BY_ITEMMAGIC);
				return true;
			} else {
				return false;
			}
		} else {
			return false;
		}
	}

	private void usePolyScale(L1PcInstance pc, int itemId) {
		int awakeSkillId = pc.getAwakeSkillId();
		if (awakeSkillId == AWAKEN_ANTHARAS || awakeSkillId == AWAKEN_FAFURION
				|| awakeSkillId == AWAKEN_VALAKAS) {
			pc.sendPackets(new S_ServerMessage(1384)); // 現在の状態では変身できません。
			return;
		}

		int polyId = 0;
		if (itemId == 41154) { // 闇の鱗
			polyId = 3101;
		} else if (itemId == 41155) { // 烈火の鱗
			polyId = 3126;
		} else if (itemId == 41156) { // 背徳者の鱗
			polyId = 3888;
		} else if (itemId == 41157) { // 憎悪の鱗
			polyId = 3784;
		} else if (itemId == 49220) { // オーク密使変身スクロール
			polyId = 6984;
		}
		L1PolyMorph.doPoly(pc, polyId, 600, L1PolyMorph.MORPH_BY_ITEMMAGIC);
	}

	private void usePolyPotion(L1PcInstance pc, int itemId) {
		int awakeSkillId = pc.getAwakeSkillId();
		if (awakeSkillId == AWAKEN_ANTHARAS || awakeSkillId == AWAKEN_FAFURION
				|| awakeSkillId == AWAKEN_VALAKAS) {
			pc.sendPackets(new S_ServerMessage(1384)); // 現在の状態では変身できません。
			return;
		}

		int polyId = 0;
		if (itemId == 41143) { // ラバーボーンヘッド変身ポーション
			polyId = 6086;
		} else if (itemId == 41144) { // ラバーボーンアーチャー変身ポーション
			polyId = 6087;
		} else if (itemId == 41145) { // ラバーボーンナイフ変身ポーション
			polyId = 6088;
		} else if (itemId == 49149 && pc.get_sex() == 0 && pc.isCrown()) {// シャルナの変身スクロール（レベル30）
			polyId = 6822;
		} else if (itemId == 49149 && pc.get_sex() == 1 && pc.isCrown()) {
			polyId = 6823;
		} else if (itemId == 49149 && pc.get_sex() == 0 && pc.isKnight()) {
			polyId = 6824;
		} else if (itemId == 49149 && pc.get_sex() == 1 && pc.isKnight()) {
			polyId = 6825;
		} else if (itemId == 49149 && pc.get_sex() == 0 && pc.isElf()) {
			polyId = 6826;
		} else if (itemId == 49149 && pc.get_sex() == 1 && pc.isElf()) {
			polyId = 6827;
		} else if (itemId == 49149 && pc.get_sex() == 0 && pc.isWizard()) {
			polyId = 6828;
		} else if (itemId == 49149 && pc.get_sex() == 1 && pc.isWizard()) {
			polyId = 6829;
		} else if (itemId == 49149 && pc.get_sex() == 0 && pc.isDarkelf()) {
			polyId = 6830;
		} else if (itemId == 49149 && pc.get_sex() == 1 && pc.isDarkelf()) {
			polyId = 6831;
		} else if (itemId == 49149 && pc.get_sex() == 0 && pc.isDragonKnight()) {
			polyId = 7139;
		} else if (itemId == 49149 && pc.get_sex() == 1 && pc.isDragonKnight()) {
			polyId = 7140;
		} else if (itemId == 49149 && pc.get_sex() == 0 && pc.isIllusionist()) {
			polyId = 7141;
		} else if (itemId == 49149 && pc.get_sex() == 1 && pc.isIllusionist()) {
			polyId = 7142;
		} else if (itemId == 49150 && pc.get_sex() == 0 && pc.isCrown()) { // シャルナの変身スクロール（レベル40）
			polyId = 6832;
		} else if (itemId == 49150 && pc.get_sex() == 1 && pc.isCrown()) {
			polyId = 6833;
		} else if (itemId == 49150 && pc.get_sex() == 0 && pc.isKnight()) {
			polyId = 6834;
		} else if (itemId == 49150 && pc.get_sex() == 1 && pc.isKnight()) {
			polyId = 6835;
		} else if (itemId == 49150 && pc.get_sex() == 0 && pc.isElf()) {
			polyId = 6836;
		} else if (itemId == 49150 && pc.get_sex() == 1 && pc.isElf()) {
			polyId = 6837;
		} else if (itemId == 49150 && pc.get_sex() == 0 && pc.isWizard()) {
			polyId = 6838;
		} else if (itemId == 49150 && pc.get_sex() == 1 && pc.isWizard()) {
			polyId = 6839;
		} else if (itemId == 49150 && pc.get_sex() == 0 && pc.isDarkelf()) {
			polyId = 6840;
		} else if (itemId == 49150 && pc.get_sex() == 1 && pc.isDarkelf()) {
			polyId = 6841;
		} else if (itemId == 49150 && pc.get_sex() == 0 && pc.isDragonKnight()) {
			polyId = 7143;
		} else if (itemId == 49150 && pc.get_sex() == 1 && pc.isDragonKnight()) {
			polyId = 7144;
		} else if (itemId == 49150 && pc.get_sex() == 0 && pc.isIllusionist()) {
			polyId = 7145;
		} else if (itemId == 49150 && pc.get_sex() == 1 && pc.isIllusionist()) {
			polyId = 7146;
		} else if (itemId == 49151 && pc.get_sex() == 0 && pc.isCrown()) { // シャルナの変身スクロール（レベル52）
			polyId = 6842;
		} else if (itemId == 49151 && pc.get_sex() == 1 && pc.isCrown()) {
			polyId = 6843;
		} else if (itemId == 49151 && pc.get_sex() == 0 && pc.isKnight()) {
			polyId = 6844;
		} else if (itemId == 49151 && pc.get_sex() == 1 && pc.isKnight()) {
			polyId = 6845;
		} else if (itemId == 49151 && pc.get_sex() == 0 && pc.isElf()) {
			polyId = 6846;
		} else if (itemId == 49151 && pc.get_sex() == 1 && pc.isElf()) {
			polyId = 6847;
		} else if (itemId == 49151 && pc.get_sex() == 0 && pc.isWizard()) {
			polyId = 6848;
		} else if (itemId == 49151 && pc.get_sex() == 1 && pc.isWizard()) {
			polyId = 6849;
		} else if (itemId == 49151 && pc.get_sex() == 0 && pc.isDarkelf()) {
			polyId = 6850;
		} else if (itemId == 49151 && pc.get_sex() == 1 && pc.isDarkelf()) {
			polyId = 6851;
		} else if (itemId == 49151 && pc.get_sex() == 0 && pc.isDragonKnight()) {
			polyId = 7147;
		} else if (itemId == 49151 && pc.get_sex() == 1 && pc.isDragonKnight()) {
			polyId = 7148;
		} else if (itemId == 49151 && pc.get_sex() == 0 && pc.isIllusionist()) {
			polyId = 7149;
		} else if (itemId == 49151 && pc.get_sex() == 1 && pc.isIllusionist()) {
			polyId = 7150;
		} else if (itemId == 49152 && pc.get_sex() == 0 && pc.isCrown()) { // シャルナの変身スクロール（レベル55）
			polyId = 6852;
		} else if (itemId == 49152 && pc.get_sex() == 1 && pc.isCrown()) {
			polyId = 6853;
		} else if (itemId == 49152 && pc.get_sex() == 0 && pc.isKnight()) {
			polyId = 6854;
		} else if (itemId == 49152 && pc.get_sex() == 1 && pc.isKnight()) {
			polyId = 6855;
		} else if (itemId == 49152 && pc.get_sex() == 0 && pc.isElf()) {
			polyId = 6856;
		} else if (itemId == 49152 && pc.get_sex() == 1 && pc.isElf()) {
			polyId = 6857;
		} else if (itemId == 49152 && pc.get_sex() == 0 && pc.isWizard()) {
			polyId = 6858;
		} else if (itemId == 49152 && pc.get_sex() == 1 && pc.isWizard()) {
			polyId = 6859;
		} else if (itemId == 49152 && pc.get_sex() == 0 && pc.isDarkelf()) {
			polyId = 6860;
		} else if (itemId == 49152 && pc.get_sex() == 1 && pc.isDarkelf()) {
			polyId = 6861;
		} else if (itemId == 49152 && pc.get_sex() == 0 && pc.isDragonKnight()) {
			polyId = 7151;
		} else if (itemId == 49152 && pc.get_sex() == 1 && pc.isDragonKnight()) {
			polyId = 7152;
		} else if (itemId == 49152 && pc.get_sex() == 0 && pc.isIllusionist()) {
			polyId = 7153;
		} else if (itemId == 49152 && pc.get_sex() == 1 && pc.isIllusionist()) {
			polyId = 7154;
		} else if (itemId == 49153 && pc.get_sex() == 0 && pc.isCrown()) { // シャルナの変身スクロール（レベル60）
			polyId = 6862;
		} else if (itemId == 49153 && pc.get_sex() == 1 && pc.isCrown()) {
			polyId = 6863;
		} else if (itemId == 49153 && pc.get_sex() == 0 && pc.isKnight()) {
			polyId = 6864;
		} else if (itemId == 49153 && pc.get_sex() == 1 && pc.isKnight()) {
			polyId = 6865;
		} else if (itemId == 49153 && pc.get_sex() == 0 && pc.isElf()) {
			polyId = 6866;
		} else if (itemId == 49153 && pc.get_sex() == 1 && pc.isElf()) {
			polyId = 6867;
		} else if (itemId == 49153 && pc.get_sex() == 0 && pc.isWizard()) {
			polyId = 6868;
		} else if (itemId == 49153 && pc.get_sex() == 1 && pc.isWizard()) {
			polyId = 6869;
		} else if (itemId == 49153 && pc.get_sex() == 0 && pc.isDarkelf()) {
			polyId = 6870;
		} else if (itemId == 49153 && pc.get_sex() == 1 && pc.isDarkelf()) {
			polyId = 6871;
		} else if (itemId == 49153 && pc.get_sex() == 0 && pc.isDragonKnight()) {
			polyId = 7155;
		} else if (itemId == 49153 && pc.get_sex() == 1 && pc.isDragonKnight()) {
			polyId = 7156;
		} else if (itemId == 49153 && pc.get_sex() == 0 && pc.isIllusionist()) {
			polyId = 7157;
		} else if (itemId == 49153 && pc.get_sex() == 1 && pc.isIllusionist()) {
			polyId = 7158;
		} else if (itemId == 49154 && pc.get_sex() == 0 && pc.isCrown()) { // シャルナの変身スクロール（レベル65）
			polyId = 6872;
		} else if (itemId == 49154 && pc.get_sex() == 1 && pc.isCrown()) {
			polyId = 6873;
		} else if (itemId == 49154 && pc.get_sex() == 0 && pc.isKnight()) {
			polyId = 6874;
		} else if (itemId == 49154 && pc.get_sex() == 1 && pc.isKnight()) {
			polyId = 6875;
		} else if (itemId == 49154 && pc.get_sex() == 0 && pc.isElf()) {
			polyId = 6876;
		} else if (itemId == 49154 && pc.get_sex() == 1 && pc.isElf()) {
			polyId = 6877;
		} else if (itemId == 49154 && pc.get_sex() == 0 && pc.isWizard()) {
			polyId = 6878;
		} else if (itemId == 49154 && pc.get_sex() == 1 && pc.isWizard()) {
			polyId = 6879;
		} else if (itemId == 49154 && pc.get_sex() == 0 && pc.isDarkelf()) {
			polyId = 6880;
		} else if (itemId == 49154 && pc.get_sex() == 1 && pc.isDarkelf()) {
			polyId = 6881;
		} else if (itemId == 49154 && pc.get_sex() == 0 && pc.isDragonKnight()) {
			polyId = 7159;
		} else if (itemId == 49154 && pc.get_sex() == 1 && pc.isDragonKnight()) {
			polyId = 7160;
		} else if (itemId == 49154 && pc.get_sex() == 0 && pc.isIllusionist()) {
			polyId = 7161;
		} else if (itemId == 49154 && pc.get_sex() == 1 && pc.isIllusionist()) {
			polyId = 7162;
		} else if (itemId == 49155 && pc.get_sex() == 0 && pc.isCrown()) { // シャルナの変身スクロール（レベル70）
			polyId = 6882;
		} else if (itemId == 49155 && pc.get_sex() == 1 && pc.isCrown()) {
			polyId = 6883;
		} else if (itemId == 49155 && pc.get_sex() == 0 && pc.isKnight()) {
			polyId = 6884;
		} else if (itemId == 49155 && pc.get_sex() == 1 && pc.isKnight()) {
			polyId = 6885;
		} else if (itemId == 49155 && pc.get_sex() == 0 && pc.isElf()) {
			polyId = 6886;
		} else if (itemId == 49155 && pc.get_sex() == 1 && pc.isElf()) {
			polyId = 6887;
		} else if (itemId == 49155 && pc.get_sex() == 0 && pc.isWizard()) {
			polyId = 6888;
		} else if (itemId == 49155 && pc.get_sex() == 1 && pc.isWizard()) {
			polyId = 6889;
		} else if (itemId == 49155 && pc.get_sex() == 0 && pc.isDarkelf()) {
			polyId = 6890;
		} else if (itemId == 49155 && pc.get_sex() == 1 && pc.isDarkelf()) {
			polyId = 6891;
		} else if (itemId == 49155 && pc.get_sex() == 0 && pc.isDragonKnight()) {
			polyId = 7163;
		} else if (itemId == 49155 && pc.get_sex() == 1 && pc.isDragonKnight()) {
			polyId = 7164;
		} else if (itemId == 49155 && pc.get_sex() == 0 && pc.isIllusionist()) {
			polyId = 7165;
		} else if (itemId == 49155 && pc.get_sex() == 1 && pc.isIllusionist()) {
			polyId = 7166;
		}
		L1PolyMorph.doPoly(pc, polyId, 1800, L1PolyMorph.MORPH_BY_ITEMMAGIC);
	}

	private void UseArmor(L1PcInstance activeChar, L1ItemInstance armor) {
		// int itemid = armor.getItem().getItemId();
		int type = armor.getItem().getType();
		L1PcInventory pcInventory = activeChar.getInventory();
		boolean equipeSpace; // 装備する箇所が空いているか
		if (type == 9) { // リングの場合
			equipeSpace = pcInventory.getTypeEquipped(2, 9) <= 1;
		} else {
			equipeSpace = pcInventory.getTypeEquipped(2, type) <= 0;
		}

		if (equipeSpace && !armor.isEquipped()) { // 使用した防具を装備していなくて、その装備箇所が空いている場合（装着を試みる）
			int polyid = activeChar.getTempCharGfx();

			if (!L1PolyMorph.isEquipableArmor(polyid, type)) { // その変身では装備不可
				return;
			}

			if (type == 13 && pcInventory.getTypeEquipped(2, 7) >= 1
					|| type == 7 && pcInventory.getTypeEquipped(2, 13) >= 1) { // シールド、ガーダー同時裝備不可
				activeChar.sendPackets(new S_ServerMessage(124)); // \f1すでに何かを装備しています。
				return;
			}
			if (type == 7 && activeChar.getWeapon() != null) {// シールドの場合、武器を装備していたら両手武器チェック
				if (activeChar.getWeapon().getItem().isTwohandedWeapon()) {// 両手武器判定
					if (activeChar.getWeapon().getItem().getItemId() == 277) {// エレメンタルチェーンソードの場合両手武器として判定しない
					} else {
						activeChar.sendPackets(new S_ServerMessage(129)); // \f1両手の武器を武装したままシールドを着用することはできません。
						return;
					}
				}
			}

			if (type == 3 && pcInventory.getTypeEquipped(2, 4) >= 1) { // シャツの場合、マントを着てないか確認
				activeChar
						.sendPackets(new S_ServerMessage(126, "$224", "$225")); // \f1%1上に%0を着ることはできません。
				return;
			} else if ((type == 3) && pcInventory.getTypeEquipped(2, 2) >= 1) { // シャツの場合、メイルを着てないか確認
				activeChar
						.sendPackets(new S_ServerMessage(126, "$224", "$226")); // \f1%1上に%0を着ることはできません。
				return;
			} else if ((type == 2) && pcInventory.getTypeEquipped(2, 4) >= 1) { // メイルの場合、マントを着てないか確認
				activeChar
						.sendPackets(new S_ServerMessage(126, "$226", "$225")); // \f1%1上に%0を着ることはできません。
				return;
			}

			cancelAbsoluteBarrier(activeChar); // アブソルート バリアの解除

			pcInventory.setEquipped(armor, true);
		} else if (armor.isEquipped()) { // 使用した防具を装備していた場合（脱着を試みる）
			if (armor.getItem().getBless() == 2) { // 呪われていた場合
				activeChar.sendPackets(new S_ServerMessage(150)); // \f1はずすことができません。呪いをかけられているようです。
				return;
			}
			if (type == 3 && pcInventory.getTypeEquipped(2, 2) >= 1) { // シャツの場合、メイルを着てないか確認
				activeChar.sendPackets(new S_ServerMessage(127)); // \f1それは脱ぐことができません
				return;
			} else if ((type == 2 || type == 3)
					&& pcInventory.getTypeEquipped(2, 4) >= 1) { // シャツとメイルの場合、
				// マントを着てないか確認
				activeChar.sendPackets(new S_ServerMessage(127)); // \f1それは脱ぐことができません
				return;
			}
			if (type == 7) { // シールドの場合、ソリッドキャリッジの効果消失
				if (activeChar.hasSkillEffect(SOLID_CARRIAGE)) {
					activeChar.removeSkillEffect(SOLID_CARRIAGE);
				}
			}
			pcInventory.setEquipped(armor, false);
		} else {
			activeChar.sendPackets(new S_ServerMessage(124)); // \f1すでに何かを装備しています
			// 。
		}
		// セット装備用HP、MP、MR更新
		activeChar.setCurrentHp(activeChar.getCurrentHp());
		activeChar.setCurrentMp(activeChar.getCurrentMp());
		activeChar.sendPackets(new S_OwnCharAttrDef(activeChar));
		activeChar.sendPackets(new S_OwnCharStatus(activeChar));
		activeChar.sendPackets(new S_SPMR(activeChar));
	}

	private void UseWeapon(L1PcInstance activeChar, L1ItemInstance weapon) {
		L1PcInventory pcInventory = activeChar.getInventory();
		if (activeChar.getWeapon() == null
				|| !activeChar.getWeapon().equals(weapon)) { // 指定された武器が装備している武器と違う場合、装備できるか確認
			int weapon_type = weapon.getItem().getType();
			int polyid = activeChar.getTempCharGfx();

			if (!L1PolyMorph.isEquipableWeapon(polyid, weapon_type)) { // その変身では装備不可
				return;
			}
			if (weapon.getItem().isTwohandedWeapon()
					&& pcInventory.getTypeEquipped(2, 7) >= 1) {// 両手武器の場合、シールド装備の確認
				if (weapon.getItem().getItemId() == 277) {// エレメンタルチェーンソードの場合両手武器として判定しない
				} else {
					activeChar.sendPackets(new S_ServerMessage(128)); // \f1シールドを装備している時は両手で持つ武器を使うことはできません。
					return;
				}
			}
		}

		cancelAbsoluteBarrier(activeChar); // アブソルート バリアの解除

		if (activeChar.getWeapon() != null) { // 既に何かを装備している場合、前の装備をはずす
			if (activeChar.getWeapon().getItem().getBless() == 2) { // 呪われていた場合
				activeChar.sendPackets(new S_ServerMessage(150)); // \f1はずすことができません。呪いをかけられているようです。
				return;
			}
			if (activeChar.getWeapon().equals(weapon)) {
				// 装備交換ではなく外すだけ
				pcInventory.setEquipped(activeChar.getWeapon(), false, false,
						false);
				return;
			} else {
				pcInventory.setEquipped(activeChar.getWeapon(), false, false,
						true);
			}
		}

		if (weapon.getItemId() == 200002) { // 呪われたダイスダガー
			activeChar
					.sendPackets(new S_ServerMessage(149, weapon.getLogName())); // \f1%0が手にくっつきました。
		}
		pcInventory.setEquipped(weapon, true, false, false);
	}

	private int RandomELevel(L1ItemInstance item, int itemId) {
		if (itemId == L1ItemId.B_SCROLL_OF_ENCHANT_ARMOR
				|| itemId == L1ItemId.B_SCROLL_OF_ENCHANT_WEAPON
				|| itemId == 140129 || itemId == 140130) {
			if (item.getEnchantLevel() <= 2) {
				int j = _random.nextInt(100) + 1;
				if (j < 32) {
					return 1;
				} else if (j >= 33 && j <= 76) {
					return 2;
				} else if (j >= 77 && j <= 100) {
					return 3;
				}
			} else if (item.getEnchantLevel() >= 3
					&& item.getEnchantLevel() <= 5) {
				int j = _random.nextInt(100) + 1;
				if (j < 50) {
					return 2;
				} else {
					return 1;
				}
			}
			{
				return 1;
			}
		}
		return 1;
	}

	private int doWandAction(L1PcInstance user, L1Object target) {
		if (user.getId() == target.getId()) {
			return 0; // 自分自身に当てた
		}
		if (user.glanceCheck(target.getX(), target.getY()) == false) {
			return 0; // 直線上に障害物がある
		}

		// XXX 適当なダメージ計算、要修正
		int dmg = (_random.nextInt(11) - 5) + user.getStr();
		dmg = Math.max(1, dmg);

		if (target instanceof L1PcInstance) {
			L1PcInstance pc = (L1PcInstance) target;
			if (pc.getMap().isSafetyZone(pc.getLocation())
					|| user.checkNonPvP(user, pc)) {
				return 0;
			}
			if ((pc.hasSkillEffect(50) == true)
					|| (pc.hasSkillEffect(78) == true)
					|| (pc.hasSkillEffect(157) == true)) {
				return 0;
			}

			int newHp = pc.getCurrentHp() - dmg;
			if (newHp > 0) {
				pc.setCurrentHp(newHp);
			} else if ((newHp <= 0) && pc.isGm()) {
				pc.setCurrentHp(pc.getMaxHp());
			} else if ((newHp <= 0) && !pc.isGm()) {
				pc.death(user);
			}
			return dmg;
		} else if (target instanceof L1MonsterInstance) {
			L1MonsterInstance mob = (L1MonsterInstance) target;
			mob.receiveDamage(user, dmg);
			return dmg;
		}
		return 0;
	}

	private void polyAction(L1PcInstance attacker, L1Character cha) {
		boolean isSameClan = false;
		if (cha instanceof L1PcInstance) {
			L1PcInstance pc = (L1PcInstance) cha;
			if (pc.getClanid() != 0 && attacker.getClanid() == pc.getClanid()) {
				isSameClan = true;
			}
		}
		if (attacker.getId() != cha.getId() && !isSameClan) { // 自分以外と違うクラン
			int probability = 3 * (attacker.getLevel() - cha.getLevel()) + 100
					- cha.getMr();
			int rnd = _random.nextInt(100) + 1;
			if (rnd > probability) {
				return;
			}
		}

		int[] polyArray = { 29, 945, 947, 979, 1037, 1039, 3860, 3861, 3862,
				3863, 3864, 3865, 3904, 3906, 95, 146, 2374, 2376, 2377, 2378,
				3866, 3867, 3868, 3869, 3870, 3871, 3872, 3873, 3874, 3875,
				3876 };

		int pid = _random.nextInt(polyArray.length);
		int polyId = polyArray[pid];

		if (cha instanceof L1PcInstance) {
			L1PcInstance pc = (L1PcInstance) cha;
			int awakeSkillId = pc.getAwakeSkillId();
			if (awakeSkillId == AWAKEN_ANTHARAS
					|| awakeSkillId == AWAKEN_FAFURION
					|| awakeSkillId == AWAKEN_VALAKAS) {
				pc.sendPackets(new S_ServerMessage(1384)); // 現在の状態では変身できません。
				return;
			}

			if (pc.getInventory().checkEquipped(20281)) {
				pc.sendPackets(new S_ShowPolyList(pc.getId()));
				if (!pc.isShapeChange()) {
					pc.setShapeChange(true);
				}
				pc.sendPackets(new S_ServerMessage(966)); // string-j.tbl:968行目
				// 魔法の力によって保護されます。
				// 変身の際のメッセージは、他人が自分を変身させた時に出るメッセージと、レベルが足りない時に出るメッセージ以外はありません。
			} else {
				L1Skill skillTemp = SkillTable.getInstance().findBySkillId(
						SHAPE_CHANGE);

				L1PolyMorph.doPoly(pc, polyId, skillTemp.getBuffDuration(),
						L1PolyMorph.MORPH_BY_ITEMMAGIC);
				if (attacker.getId() != pc.getId()) {
					pc
							.sendPackets(new S_ServerMessage(241, attacker
									.getName())); // %0があなたを変身させました。
				}
			}
		} else if (cha instanceof L1MonsterInstance) {
			L1MonsterInstance mob = (L1MonsterInstance) cha;
			if (mob.getLevel() < 50) {
				int npcId = mob.getNpcTemplate().get_npcId();
				if (npcId != 45338 && npcId != 45370 && npcId != 45456 // クロコダイル、
						// バンディットボス
						// 、
						// ネクロマンサー
						&& npcId != 45464 && npcId != 45473 && npcId != 45488 // セマ
						// 、
						// バルタザール
						// 、
						// カスパー
						&& npcId != 45497 && npcId != 45516 && npcId != 45529 // メルキオール
						// 、
						// イフリート
						// 、
						// ドレイク
						// (
						// DV
						// )
						&& npcId != 45458) { // ドレイク(船長)
					L1Skill skillTemp = SkillTable.getInstance().findBySkillId(
							SHAPE_CHANGE);
					L1PolyMorph.doPoly(mob, polyId,
							skillTemp.getBuffDuration(),
							L1PolyMorph.MORPH_BY_ITEMMAGIC);
				}
			}
		}
	}

	private void cancelAbsoluteBarrier(L1PcInstance pc) { // アブソルート バリアの解除
		if (pc.hasSkillEffect(ABSOLUTE_BARRIER)) {
			pc.killSkillEffectTimer(ABSOLUTE_BARRIER);
			pc.startHpRegeneration();
			pc.startMpRegeneration();
			pc.startHpRegenerationByDoll(); // TODO マジックドール HPR開始
			pc.startMpRegenerationByDoll();
		}
	}

	private void useToiTeleportAmulet(L1PcInstance pc, int itemId,
			L1ItemInstance item) {
		boolean isTeleport = false;
		if (itemId == 40289 || itemId == 40293) { // 11,51Famulet
			if (pc.getX() >= 32816 && pc.getX() <= 32821 && pc.getY() >= 32778
					&& pc.getY() <= 32783 && pc.getMapId() == 101) {
				isTeleport = true;
			}
		} else if (itemId == 40290 || itemId == 40294) { // 21,61Famulet
			if (pc.getX() >= 32815 && pc.getX() <= 32820 && pc.getY() >= 32815
					&& pc.getY() <= 32820 && pc.getMapId() == 101) {
				isTeleport = true;
			}
		} else if (itemId == 40291 || itemId == 40295) { // 31,71Famulet
			if (pc.getX() >= 32779 && pc.getX() <= 32784 && pc.getY() >= 32778
					&& pc.getY() <= 32783 && pc.getMapId() == 101) {
				isTeleport = true;
			}
		} else if (itemId == 40292 || itemId == 40296) { // 41,81Famulet
			if (pc.getX() >= 32779 && pc.getX() <= 32784 && pc.getY() >= 32815
					&& pc.getY() <= 32820 && pc.getMapId() == 101) {
				isTeleport = true;
			}
		} else if (itemId == 40297) { // 91Famulet
			if (pc.getX() >= 32706 && pc.getX() <= 32710 && pc.getY() >= 32909
					&& pc.getY() <= 32913 && pc.getMapId() == 190) {
				isTeleport = true;
			}
		}

		if (isTeleport) {
			L1Teleport.teleport(pc, item.getItem().get_locx(), item.getItem()
					.get_locy(), item.getItem().get_mapid(), 5, true);
		} else {
			pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
		}
	}

	private boolean writeLetter(int itemId, L1PcInstance pc, int letterCode,
			String letterReceiver, byte[] letterText) {

		int newItemId = 0;
		if (itemId == 40310) {
			newItemId = 49016;
		} else if (itemId == 40730) {
			newItemId = 49020;
		} else if (itemId == 40731) {
			newItemId = 49022;
		} else if (itemId == 40732) {
			newItemId = 49024;
		}
		L1ItemInstance item = ItemTable.getInstance().createItem(newItemId);
		item.setCount(1);
		if (item == null) {
			return false;
		}

		if (sendLetter(pc, letterReceiver, item, true)) {
			saveLetter(item.getId(), letterCode, pc.getName(), letterReceiver,
					letterText);
		} else {
			return false;
		}
		return true;
	}

	private boolean writeClanLetter(int itemId, L1PcInstance pc,
			int letterCode, String letterReceiver, byte[] letterText) {
		L1Clan targetClan = null;
		for (L1Clan clan : L1World.getInstance().getAllClans()) {
			if (clan.getClanName().toLowerCase().equals(
					letterReceiver.toLowerCase())) {
				targetClan = clan;
				break;
			}
		}
		if (targetClan == null) {
			pc.sendPackets(new S_ServerMessage(434)); // 受信者がいません。
			return false;
		}

		String memberName[] = targetClan.getAllMembers();
		for (int i = 0; i < memberName.length; i++) {
			L1ItemInstance item = ItemTable.getInstance().createItem(49016);
			item.setCount(1);
			if (item == null) {
				return false;
			}
			if (sendLetter(pc, memberName[i], item, false)) {
				saveLetter(item.getId(), letterCode, pc.getName(),
						memberName[i], letterText);
			}
		}
		return true;
	}

	private boolean sendLetter(L1PcInstance pc, String name,
			L1ItemInstance item, boolean isFailureMessage) {
		L1PcInstance target = L1World.getInstance().getPlayer(name);
		if (target != null) {
			if (target.getInventory().checkAddItem(item, 1) == L1Inventory.OK) {
				target.getInventory().storeItem(item);
				target.sendPackets(new S_SkillSound(target.getId(), 1091));
				target.sendPackets(new S_ServerMessage(428)); // 手紙が届きました。
			} else {
				if (isFailureMessage) {
					// 相手のアイテムが重すぎるため、これ以上あげられません。
					pc.sendPackets(new S_ServerMessage(942));
				}
				return false;
			}
		} else {
			if (CharacterTable.doesCharNameExist(name)) {
				try {
					int targetId = CharacterTable.getInstance()
							.restoreCharacter(name).getId();

					if (L1InventoryItem.countByOwnerId(targetId) < 180) {
						item.setOwner(targetId, L1InventoryItem.LOC_CHARACTER);
						item.save();
					} else {
						if (isFailureMessage) {
							// 相手のアイテムが重すぎるため、これ以上あげられません。
							pc.sendPackets(new S_ServerMessage(942));
						}
						return false;
					}
				} catch (Exception e) {
					_log.log(Level.SEVERE, e.getLocalizedMessage(), e);
				}
			} else {
				if (isFailureMessage) {
					pc.sendPackets(new S_ServerMessage(109, name)); // %0
					// という名前の人はいません
					// 。
				}
				return false;
			}
		}
		return true;
	}

	private void saveLetter(int itemObjectId, int code, String sender,
			String receiver, byte[] text) {
		// 日付を取得する
		SimpleDateFormat sdf = new SimpleDateFormat("yy/MM/dd");
		TimeZone tz = TimeZone.getTimeZone(Config.TIME_ZONE);
		String date = sdf.format(Calendar.getInstance(tz).getTime());

		// subjectとcontentの区切り(0x00 0x00)位置を見つける
		int spacePosition1 = 0;
		int spacePosition2 = 0;
		for (int i = 0; i < text.length; i += 2) {
			if (text[i] == 0 && text[i + 1] == 0) {
				if (spacePosition1 == 0) {
					spacePosition1 = i;
				} else if (spacePosition1 != 0 && spacePosition2 == 0) {
					spacePosition2 = i;
					break;
				}
			}
		}

		// letterテーブルに書き込む
		int subjectLength = spacePosition1 + 2;
		int contentLength = spacePosition2 - spacePosition1;
		if (contentLength <= 0) {
			contentLength = 1;
		}
		byte[] subject = new byte[subjectLength];
		byte[] content = new byte[contentLength];
		System.arraycopy(text, 0, subject, 0, subjectLength);
		System.arraycopy(text, subjectLength, content, 0, contentLength);
		LetterTable.getInstance().writeLetter(itemObjectId, code, sender,
				receiver, date, 0, subject, content);
	}

	private boolean withdrawPet(L1PcInstance pc, int itemObjectId) {
		int petCost = 0;
		int petCount = 0;
		int divisor = 6;

		if (!pc.getMap().isTakePets()) {
			pc.sendPackets(new S_ServerMessage(563)); // \f1ここでは使えません。
			return false;
		}

		Object[] petList = pc.getPetList().values().toArray();
		for (Object pet : petList) {
			if (pet instanceof L1PetInstance) {
				if (((L1PetInstance) pet).getItemObjId() == itemObjectId) { // 既に引き出しているペット
					return false;
				}
			}
			petCost += ((L1NpcInstance) pet).getPetcost();
		}
		int charisma = pc.getCha();
		if (pc.isCrown()) { // 君主
			charisma += 6;
		} else if (pc.isElf()) { // エルフ
			charisma += 12;
		} else if (pc.isWizard()) { // WIZ
			charisma += 6;
		} else if (pc.isDarkelf()) { // DE
			charisma += 6;
		} else if (pc.isDragonKnight()) { // ドラゴンナイト
			charisma += 6;
		} else if (pc.isIllusionist()) { // イリュージョニスト
			charisma += 6;
		}

		L1Pet l1pet = PetTable.getInstance().getTemplate(itemObjectId);
		if (l1pet != null) {
			int npcId = l1pet.getNpcId();
			charisma -= petCost;
			if (npcId == 45313 || npcId == 45710 // タイガー、バトルタイガー
					|| npcId == 45711 || npcId == 45712) { // 紀州犬の子犬、紀州犬
				divisor = 12;
			} else {
				divisor = 6;
			}
			petCount = charisma / divisor;
			if (petCount <= 0) {
				pc.sendPackets(new S_ServerMessage(489)); // 引き取ろうとするペットが多すぎます。
				return false;
			}
			L1Npc npcTemp = NpcTable.getInstance().getTemplate(npcId);
			L1PetInstance pet = new L1PetInstance(npcTemp, pc, l1pet);
			pet.setPetcost(divisor);
		}
		return true;
	}

	private void startFishing(L1PcInstance pc, int itemId, int fishX, int fishY) {
		if (pc.getMapId() != 5124 || fishX <= 32789 || fishX >= 32813
				|| fishY <= 32786 || fishY >= 32812) {
			// ここに釣り竿を投げることはできません。
			pc.sendPackets(new S_ServerMessage(1138));
			return;
		}

		int rodLength = 0;
		if (itemId == 41293) {
			rodLength = 5;
		} else if (itemId == 41294) {
			rodLength = 3;
		}
		if (pc.getMap().isFishingZone(fishX, fishY)) {
			if (pc.getMap().isFishingZone(fishX + 1, fishY)
					&& pc.getMap().isFishingZone(fishX - 1, fishY)
					&& pc.getMap().isFishingZone(fishX, fishY + 1)
					&& pc.getMap().isFishingZone(fishX, fishY - 1)) {
				if (fishX > pc.getX() + rodLength
						|| fishX < pc.getX() - rodLength) {
					// ここに釣り竿を投げることはできません。
					pc.sendPackets(new S_ServerMessage(1138));
				} else if (fishY > pc.getY() + rodLength
						|| fishY < pc.getY() - rodLength) {
					// ここに釣り竿を投げることはできません。
					pc.sendPackets(new S_ServerMessage(1138));
				} else if (pc.getInventory().consumeItem(41295, 1)) { // エサ
					pc.sendPackets(new S_Fishing(pc.getId(),
							ActionCodes.ACTION_Fishing, fishX, fishY));
					pc.broadcastPacket(new S_Fishing(pc.getId(),
							ActionCodes.ACTION_Fishing, fishX, fishY));
					pc.setFishing(true);
					long time = System.currentTimeMillis() + 10000
							+ _random.nextInt(5) * 1000;
					pc.setFishingTime(time);
					FishingTimeController.getInstance().addMember(pc);
				} else {
					// 釣りをするためにはエサが必要です。
					pc.sendPackets(new S_ServerMessage(1137));
				}
			} else {
				// ここに釣り竿を投げることはできません。
				pc.sendPackets(new S_ServerMessage(1138));
			}
		} else {
			// ここに釣り竿を投げることはできません。
			pc.sendPackets(new S_ServerMessage(1138));
		}
	}

	private void useResolvent(L1PcInstance pc, L1ItemInstance item,
			L1ItemInstance resolvent) {
		if (item == null || resolvent == null) {
			pc.sendPackets(new S_ServerMessage(79)); // \f1何も起きませんでした。
			return;
		}
		if (item.getItem().getType2() == 1 || item.getItem().getType2() == 2) { // 武器・防具
			if (item.getEnchantLevel() != 0) { // 強化済み
				pc.sendPackets(new S_ServerMessage(1161)); // 溶解できません。
				return;
			}
			if (item.isEquipped()) { // 装備中
				pc.sendPackets(new S_ServerMessage(1161)); // 溶解できません。
				return;
			}
		}
		int crystalCount = ResolventTable.getInstance().getCrystalCount(
				item.getItem().getItemId());
		if (crystalCount == 0) {
			pc.sendPackets(new S_ServerMessage(1161)); // 溶解できません。
			return;
		}

		int rnd = _random.nextInt(100) + 1;
		if (rnd >= 1 && rnd <= 50) {
			crystalCount = 0;
			pc.sendPackets(new S_ServerMessage(158, item.getName())); // \f1%0
			// が蒸発してなくなりました
			// 。
		} else if (rnd >= 51 && rnd <= 90) {
			crystalCount *= 1;
		} else if (rnd >= 91 && rnd <= 100) {
			crystalCount *= 1.5;
			pc.getInventory().storeItem(41246, (int) (crystalCount * 1.5));
		}
		if (crystalCount != 0) {
			L1ItemInstance crystal = ItemTable.getInstance().createItem(41246);
			crystal.setCount(crystalCount);
			if (pc.getInventory().checkAddItem(crystal, 1) == L1Inventory.OK) {
				pc.getInventory().storeItem(crystal);
				pc.sendPackets(new S_ServerMessage(403, crystal.getLogName())); // %
				// 0
				// を手に入れました
				// 。
			} else { // 持てない場合は地面に落とす 處理のキャンセルはしない（不正防止）
				L1World.getInstance().getInventory(pc.getX(), pc.getY(),
						pc.getMapId()).storeItem(crystal);
			}
		}
		pc.getInventory().removeItem(item, 1);
		pc.getInventory().removeItem(resolvent, 1);
	}

	private void useMagicDoll(L1PcInstance pc, int itemId, int itemObjectId) {
		L1MagicDoll magic_doll = MagicDollTable.getInstance().getTemplate(
				(itemId));
		if (magic_doll != null) {

			boolean isAppear = true;
			L1DollInstance doll = null;
			Object[] dollList = pc.getDollList().values().toArray();
			for (Object dollObject : dollList) {
				doll = (L1DollInstance) dollObject;
				if (doll.getItemObjId() == itemObjectId) { // 既に引き出しているマジックドール
					isAppear = false;
					break;
				}
			}

			if (isAppear) {
				if (!pc.getInventory().checkItem(41246, 50)) {
					pc.sendPackets(new S_ServerMessage(337, "$5240")); // \f1%0が不足しています。
					return;
				}
				if (dollList.length >= Config.MAX_DOLL_COUNT) {
					// \f1これ以上のモンスターを操ることはできません。
					pc.sendPackets(new S_ServerMessage(319));
					return;
				}

				int npcId = magic_doll.getDollId();
				L1Npc template = NpcTable.getInstance().getTemplate(npcId);
				doll = new L1DollInstance(template, pc, itemId, itemObjectId);
				pc.sendPackets(new S_SkillSound(doll.getId(), 5935));
				pc.broadcastPacket(new S_SkillSound(doll.getId(), 5935));
				pc.sendPackets(new S_SkillIconGFX(56, 1800));
				pc.sendPackets(new S_OwnCharStatus(pc));
				pc.getInventory().consumeItem(41246, 50);
			} else {
				pc.sendPackets(new S_SkillSound(doll.getId(), 5936));
				pc.broadcastPacket(new S_SkillSound(doll.getId(), 5936));
				doll.deleteDoll();
				pc.sendPackets(new S_SkillIconGFX(56, 0));
				pc.sendPackets(new S_OwnCharStatus(pc));
			}

		}
	}

	@SuppressWarnings("unchecked")
	private void useFurnitureItem(L1PcInstance pc, int itemId, int itemObjectId) {
		if (!L1HouseLocation.isInHouse(pc.getX(), pc.getY(), pc.getMapId())) {
			pc.sendPackets(new S_ServerMessage(563)); // \f1ここでは使えません。
			return;
		}

		boolean isAppear = true;
		L1FurnitureInstance furniture = null;
		for (L1Object l1object : L1World.getInstance().getObject()) {
			if (l1object instanceof L1FurnitureInstance) {
				furniture = (L1FurnitureInstance) l1object;
				if (furniture.getItemObjId() == itemObjectId) { // 既に引き出している家具
					isAppear = false;
					break;
				}
			}
		}

		if (isAppear) {
			if (pc.getHeading() != 0 && pc.getHeading() != 2) {
				return;
			}
			int npcId = 0;
			if (itemId == 41383) { // ジャイアントアントソルジャーの剥製
				npcId = 80109;
			} else if (itemId == 41384) { // ベアーの剥製
				npcId = 80110;
			} else if (itemId == 41385) { // ラミアの剥製
				npcId = 80113;
			} else if (itemId == 41386) { // ブラックタイガーの剥製
				npcId = 80114;
			} else if (itemId == 41387) { // 鹿の剥製
				npcId = 80115;
			} else if (itemId == 41388) { // ハーピーの剥製
				npcId = 80124;
			} else if (itemId == 41389) { // ブロンズナイト
				npcId = 80118;
			} else if (itemId == 41390) { // ブロンズホース
				npcId = 80119;
			} else if (itemId == 41391) { // 燭台
				npcId = 80120;
			} else if (itemId == 41392) { // ティーテーブル
				npcId = 80121;
			} else if (itemId == 41393) { // 火鉢
				npcId = 80126;
			} else if (itemId == 41394) { // たいまつ
				npcId = 80125;
			} else if (itemId == 41395) { // 君主用のお立ち台
				npcId = 80111;
			} else if (itemId == 41396) { // 旗
				npcId = 80112;
			} else if (itemId == 41397) { // ティーテーブル用の椅子(右)
				npcId = 80116;
			} else if (itemId == 41398) { // ティーテーブル用の椅子(左)
				npcId = 80117;
			} else if (itemId == 41399) { // パーティション(右)
				npcId = 80122;
			} else if (itemId == 41400) { // パーティション(左)
				npcId = 80123;
			}

			try {
				L1Npc l1npc = NpcTable.getInstance().getTemplate(npcId);
				if (l1npc != null) {
					// Object obj = null;
					try {
						String s = l1npc.getImpl();
						Constructor constructor = Class.forName(
								"l1j.server.server.model.Instance." + s
										+ "Instance").getConstructors()[0];
						Object aobj[] = { l1npc };
						furniture = (L1FurnitureInstance) constructor
								.newInstance(aobj);
						furniture.setId(IdFactory.getInstance().nextId());
						furniture.setMap(pc.getMapId());
						if (pc.getHeading() == 0) {
							furniture.setX(pc.getX());
							furniture.setY(pc.getY() - 1);
						} else if (pc.getHeading() == 2) {
							furniture.setX(pc.getX() + 1);
							furniture.setY(pc.getY());
						}
						furniture.setHomeX(furniture.getX());
						furniture.setHomeY(furniture.getY());
						furniture.setHeading(0);
						furniture.setItemObjId(itemObjectId);

						L1World.getInstance().storeObject(furniture);
						L1World.getInstance().addVisibleObject(furniture);
						FurnitureSpawnTable.getInstance().insertFurniture(
								furniture);
					} catch (Exception e) {
						_log.log(Level.SEVERE, e.getLocalizedMessage(), e);
					}
				}
			} catch (Exception exception) {
			}
		} else {
			furniture.deleteMe();
			FurnitureSpawnTable.getInstance().deleteFurniture(furniture);
		}
	}

	private void useFurnitureRemovalWand(L1PcInstance pc, int targetId,
			L1ItemInstance item) {
		S_AttackPacket s_attackPacket = new S_AttackPacket(pc, 0,
				ActionCodes.ACTION_Wand);
		pc.sendPackets(s_attackPacket);
		pc.broadcastPacket(s_attackPacket);
		int chargeCount = item.getChargeCount();
		if (chargeCount <= 0) {
			return;
		}

		L1Object target = L1World.getInstance().findObject(targetId);
		if (target != null && target instanceof L1FurnitureInstance) {
			L1FurnitureInstance furniture = (L1FurnitureInstance) target;
			furniture.deleteMe();
			FurnitureSpawnTable.getInstance().deleteFurniture(furniture);
			if (item.getChargeCount() > 1) {
				item.setChargeCount(item.getChargeCount() - 1);
				pc.getInventory().updateItem(item,
						L1PcInventory.COL_CHARGE_COUNT);
			} else {
				pc.getInventory().deleteItem(item);
			}
		}
	}

	@Override
	public String getType() {
		return C_ITEM_USE;
	}
}